1818IP-服务器技术教程,云服务器评测推荐,服务器系统排错处理,环境搭建,攻击防护等

当前位置:首页 - 数据库 - 正文

君子好学,自强不息!

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; 

本文来源:1818IP

本文地址:https://www.1818ip.com/post/4534.html

免责声明:本文由用户上传,如有侵权请联系删除!

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。