发布于 2016-03-13 04:18:11 | 143 次阅读 | 评论: 0 | 来源: 网友投递

这里有新鲜出炉的精品教程,程序狗速度看过来!

Oracle关系数据库管理系统

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。到目前仍在数据库市场上占有主要份额。


实际项目当中经常需要在一个存储过程中调用另一个存储过程返回的游标,本文列举了两种情况讲述具体的操作方法。
第一种情况是返回的游标是某个具体的表或视图的数据,如:
SQL-Code:
 
CREATE OR REPLACE PROCEDURE P_TESTA ( 
PRESULT OUT SYS_REFCURSOR 
) 
AS 
BEGIN 
OPEN PRESULT FOR SELECT * FROM USERS; 
END P_TESTA; 

其中USERS就是数据库中一个表。在调用的时候只要声明一个该表的ROWTYPE类型就可以了:
SQL-Code:
 
CREATE OR REPLACE PROCEDURE P_TESTB 
AS 
VARCURSOR SYS_REFCURSOR; 
R USERS%ROWTYPE; 
BEGIN 
P_TESTA(VARCURSOR); 
LOOP 
FETCH VARCURSOR INTO R; 
EXIT WHEN VARCURSOR%NOTFOUND; 
DBMS_OUTPUT.PUT_LINE(R.NAME); 
END LOOP; 
END P_TESTB; 

第二种情况,我们返回的不是表的所有的列,或许只是其中一列或两列,如:
SQL-Code:
 
CREATE OR REPLACE PROCEDURE P_TESTA ( 
PRESULT OUT SYS_REFCURSOR 
) 
AS 
BEGIN 
OPEN PRESULT FOR SELECT ID,NAME FROM USERS; 
END P_TESTA; 

这里我们只返回了USERS表的ID,NAME这两个列,那么调用的时候也必须做相应的修改:
SQL-Code:
 
CREATE OR REPLACE PROCEDURE P_TESTB 
AS 
VARCURSOR SYS_REFCURSOR; 
CURSOR TMPCURSOR IS SELECT ID,NAME FROM USERS WHERE ROWNUM=1; 
R TMPCURSOR%ROWTYPE; 
BEGIN 
P_TESTA(VARCURSOR); 
LOOP 
FETCH VARCURSOR INTO R; 
EXIT WHEN VARCURSOR%NOTFOUND; 
DBMS_OUTPUT.PUT_LINE(R.ID); 
END LOOP; 
END P_TESTB; 

与之前不同的是我们声明了一个游标类型的变量TMPCURSOR ,注意TMPCURSOR 的结构必须与存储过程P_TESTA 返回的游标结构一致,否则就会出现错误。同理只要保持两个游标类型结构一致,就可以实现自由调用。

最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务