oracle创建存储过程是我们经常需要用到的功能,下面就为您介绍oracle创建存储过程和其他数据库的区别,如果您感兴趣的话,不妨一看。
在oracle创建存储过程和sybase及sql server下的语法有些不一致之处。 下面就此用不同的数据库下存储过程的例子来演示之。 --------------------------- oracle创建存储过程:
CREATEORREPLACEFUNCTIONMY_FUNC ( P1INMY_TABLE.YY%TYPE, P2INMY_TABLE.NN%TYPE, P3VARCHAR(100) ) RETURNVARCHAR2AS
/*定义有参数的游标和无参数的游标*/
CURSORMY_CURSOR1IS SELECTYY,NN,DECODE(FYYSDM,0,'合计',1,'加工费','其他费用要素') FROMMY_TABLE WHEREYY=P1 GROUPBYYY,NN ORDERBYYY,NN;
/*定义游标变量,存储游标数据集中的记录*/
V_CURSOR1MY_CURSOR1%ROWTYPE; CURSORMY_CURSOR2(V_ZYDMMY_TABLE.ZYDM%TYPE,V_FYYSDMNUMBER)AS SELECTYY,NN,ZYDM,NVL(ZYCB,0)/*NVL函数转换空值为指定值*/ FROMMY_TABLE WHEREYY=P1ANDNN=P2ANDZYDM=V_ZYDMANDFYYSDM=V_FYYSDM GROUPBYYY,NN;
/*定义游标变量,存储游标数据集中的记录*/
V_CURSOR2MY_CURSOR2%ROWTYPE; V_CPDMMY_TABLE.CPDM%TYPE; V_COUNTNUMBER; V_BZVARCHAR2(2); V_CPCBNUMBER(22,2); BEGIN V_BZ:=1; SELECTCPDMINTOV_CPDMFROMMY_TABLE; SELECTCPCBINTOV_CPCBFROMMY_TABLEWHEREROWNUM=1; IFMY_CURSOR1%ISOPENTHEN/*判断游标是否已经打开*/ CLOSEMY_CURSOR1; ENDIF; OPENMY_CURSOR1; FETCHMY_CURSOR1INTOV_CURSOR1; IFMY_CURSOR1%NOTFOUNDTHEN/*游标返回结果为空*/ CLOSEMY_CURSOR1; RETURN(V_BZ); ENDIF; WHILEMY_CURSOR1%FOUNDLOOP/*游标返回结果不为空*/ V_CPDM:=V_CURSOR1.CPDM; V_CPCB:=V_CURSOR1.CPCB; V_COUNT:=100; IFV_COUNT=100THEN V_COUNT:=99; ENDIF; FETCHMY_CURSOR1INTOV_CURSOR1; ENDLOOP; CLOSEMY_CURSOR1;
/*显式打开带参游标*/
SELECTCPDMINTOV_CPDMFROMMY_TABLE; OPENMY_CURSOR2; FETCHMY_CURSOR2INTOV_CURSOR2; WHILEMY_CURSOR2%FOUNDLOOP/*游标返回结果不为空*/ V_CPDM:=V_CURSOR2.CPDM; V_CPCB:=V_CURSOR2.CPCB; V_COUNT:=100; IFV_COUNT=100THEN V_COUNT:=99; ELSE V_COUNT:=88; ENDIF; FETCHMY_CURSOR2INTOV_CURSOR2; ENDLOOP; CLOSEMYCURSOR2;
/*隐式打开游标*/
FORV_CURSOR2INMY_CURSOR2(V_CPDM,V_CURSOR1.FYYSDM)LOOP IFV_CURSOR2.CPCBISNULLTHEN PRINT'非法!'; ROLLBACK; ENDIF; UPDATEMY_TABLE SETCPCB=V_CPCB WHEREYY=P1ANDNN=P2ANDCPDM=V_CURSOR2.CPDM; IFSQL%NOTFOUNDTHEN/*判断前句是否有执行结果*/ /*程序段*/ ENDIF; ENDLOOP; V_BZ:=MY_DELETE_CB(P_YY,P_NN); IFV_BZ<>0THEN PRINT'失败!'; ENDIF; FORIINT1..V_COUNTLOOP /**/ ENDLOOP; COMMIT;/*提交事务*/ RETURN(0);/*要有返回值*/ ENDMY_FUNC; CREATEORREPLACEPROCEDURESP_MY ( P_YYINMY_TABLE.YY%TYPE; P_NNNUMBER; ) IS CURSORMY_CURSORIS SELECTCPCB FROMMY_TABLE WHEREYY=P_YYANDNN=P_NN; V_ZYCBNUMBER(22,2); BEGIN /**/ /*无返回值*/ END;
相关文章
标签:Oracle