当前位置:服务支持 >  软件文章 >  oracle存储过程与sybase区别 对比解析与应用建议

oracle存储过程与sybase区别 对比解析与应用建议

阅读数 8
点赞 0
article_banner

oracle创建存储过程是我们经常需要用到的功能,下面就为您介绍oracle创建存储过程和其他数据库的区别,如果您感兴趣的话,不妨一看。

在oracle创建存储过程和sybase及sql server下的语法有些不一致之处。
下面就此用不同的数据库下存储过程的例子来演示之。
---------------------------
oracle创建存储过程:

CREATE OR REPLACE FUNCTION MY_FUNC  
(  
P1 IN MY_TABLE.YY%TYPE,  
P2 IN MY_TABLE.NN%TYPE,  
P3 VARCHAR(100)  
)  
RETURN VARCHAR2 AS  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

/*定义有参数的游标和无参数的游标*/

CURSOR MY_CURSOR1 IS  
    SELECT YY,NN,DECODE(FYYSDM,0,'合计',1,'加工费','其他费用要素')  
    FROM MY_TABLE  
    WHERE YY=P1 
    GROUP BY YY,NN  
    ORDER BY YY,NN;  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

/*定义游标变量,存储游标数据集中的记录*/

V_CURSOR1 MY_CURSOR1%ROWTYPE;   
 
CURSOR MY_CURSOR2(V_ZYDM MY_TABLE.ZYDM%TYPE,V_FYYSDM NUMBER) AS  
    SELECT YY,NN,ZYDM,NVL(ZYCB,0) /*NVL函数转换空值为指定值*/  
    FROM MY_TABLE  
    WHERE YY=P1 AND NN=P2 AND ZYDM=V_ZYDM AND FYYSDM=V_FYYSDM 
    GROUP BY YY,NN;  
 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

/*定义游标变量,存储游标数据集中的记录*/

V_CURSOR2 MY_CURSOR2%ROWTYPE;   
 
V_CPDM  MY_TABLE.CPDM%TYPE;  
V_COUNT NUMBER;  
V_BZ    VARCHAR2(2);  
V_CPCB  NUMBER(22,2);  
 
BEGIN  
    V_BZ:=1;  
    SELECT CPDM INTO V_CPDM FROM MY_TABLE;  
    SELECT CPCB INTO V_CPCB FROM MY_TABLE WHERE ROWNUM=1;  
      
    IF MY_CURSOR1%ISOPEN THEN /*判断游标是否已经打开*/  
        CLOSE MY_CURSOR1;  
    END IF;  
    OPEN MY_CURSOR1;  
    FETCH MY_CURSOR1 INTO V_CURSOR1;  
    IF MY_CURSOR1%NOTFOUND THEN /*游标返回结果为空*/  
        CLOSE MY_CURSOR1;  
           RETURN(V_BZ);  
    END IF;  
    WHILE MY_CURSOR1%FOUND LOOP /*游标返回结果不为空*/  
        V_CPDM:=V_CURSOR1.CPDM;  
        V_CPCB:=V_CURSOR1.CPCB;  
        V_COUNT:=100;  
        IF V_COUNT=100 THEN  
            V_COUNT:=99;  
        END IF;  
            FETCH MY_CURSOR1 INTO V_CURSOR1;  
    END LOOP;  
    CLOSE MY_CURSOR1;  
 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.

    /*显式打开带参游标*/

SELECT CPDM INTO V_CPDM FROM MY_TABLE;  
OPEN MY_CURSOR2;  
FETCH MY_CURSOR2 INTO V_CURSOR2;  
WHILE MY_CURSOR2%FOUND LOOP /*游标返回结果不为空*/  
    V_CPDM:=V_CURSOR2.CPDM;  
    V_CPCB:=V_CURSOR2.CPCB;  
    V_COUNT:=100;  
    IF V_COUNT=100 THEN  
        V_COUNT:=99;  
    ELSE  
        V_COUNT:=88;  
    END IF;  
        FETCH MY_CURSOR2 INTO V_CURSOR2;  
END LOOP;  
CLOSE MYCURSOR2;  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

    /*隐式打开游标*/

    FOR V_CURSOR2 IN MY_CURSOR2(V_CPDM,V_CURSOR1.FYYSDM) LOOP  
        IF V_CURSOR2.CPCB IS NULL THEN  
           PRINT '非法!';  
           ROLLBACK;  
        END IF;  
 
        UPDATE MY_TABLE  
        SET CPCB=V_CPCB 
        WHERE YY=P1 AND NN=P2 AND CPDM=V_CURSOR2.CPDM;  
        IF SQL%NOTFOUND THEN /*判断前句是否有执行结果*/  
           /*程序段*/  
        END IF;  
    END LOOP;  
      
    V_BZ:=MY_DELETE_CB(P_YY,P_NN);  
    IF V_BZ<>0 THEN  
        PRINT '失败!';  
    END IF;  
    FOR I INT 1..V_COUNT LOOP  
        /**/  
    END LOOP;  
 
    COMMIT;/*提交事务*/  
    RETURN(0);/*要有返回值*/  
END MY_FUNC;  
 
CREATE OR REPLACE PROCEDURE SP_MY   
(  
P_YY IN MY_TABLE.YY%TYPE;  
P_NN NUMBER;  
)  
IS  
 
CURSOR MY_CURSOR IS  
    SELECT CPCB   
    FROM MY_TABLE   
    WHERE YY=P_YY AND NN=P_NN;  
 
V_ZYCB NUMBER(22,2);  
 
BEGIN  
    /**/  
    /*无返回值*/  
END;  
 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删
相关文章
QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空