oracle存储过程中使用游标作为out类型参数,求救!
先在包中定义了一个游标:--将数据类型REF_CURSOR定义在自定义的程序包中pkg_constCREATEORREPLACEPACKAGEPKG_CONSTASTYP...
先在包中定义了一个游标:
--将数据类型 REF_CURSOR 定义在自定义的程序包中pkg_const
CREATE OR REPLACE PACKAGE PKG_CONST AS
TYPE REF_CURSOR IS REF CURSOR;
END PKG_CONST;
然后在存储过程中使用该游标类型参数作为out型参数
CREATE OR REPLACE PROCEDURE GET_EMPINFOBYDEPNO(IN_DEPNO IN NUMBER,
OUT_EMPINFO OUT PKG_CONST.REF_CURSOR) AS
BEGIN
OPEN OUT_EMPINFO FOR
SELECT EMPNO, ENAME FROM EMP WHERE DEPTNO = IN_DEPNO;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('获取员工信息发生错误');
END GET_EMPINFOBYDEPNO;
/
***以上两步均操作成功,问题出在第三步,我在执行这个存储过程时报错:open那行的游标变量定义错误,请高手指点
SET serveroutput ON;
DECLARE
RET_CURSOR_VALUE PKG_CONST.REF_CURSOR;
RET_EMPNO EMP.EMPNO%TYPE;
RET_ENAME EMP.ENAME%TYPE;
BEGIN
GET_EMPINFOBYDEPNO(1, RET_CURSOR_VALUE);
OPEN RET_CURSOR_VALUE ;--报游标类型有误,未解决!!!
LOOP
FETCH RET_CURSOR_VALUE
INTO RET_EMPNO, RET_ENAME;
EXIT WHEN RET_CURSOR_VALUE%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('empNo is:' || RET_EMPNO || ',empName is' ||
RET_ENAME);
END LOOP;
CLOSE RET_CURSOR_VALUE;
END;
请直接解决此问题。。用sys_refcursor搞不定。。。 展开
--将数据类型 REF_CURSOR 定义在自定义的程序包中pkg_const
CREATE OR REPLACE PACKAGE PKG_CONST AS
TYPE REF_CURSOR IS REF CURSOR;
END PKG_CONST;
然后在存储过程中使用该游标类型参数作为out型参数
CREATE OR REPLACE PROCEDURE GET_EMPINFOBYDEPNO(IN_DEPNO IN NUMBER,
OUT_EMPINFO OUT PKG_CONST.REF_CURSOR) AS
BEGIN
OPEN OUT_EMPINFO FOR
SELECT EMPNO, ENAME FROM EMP WHERE DEPTNO = IN_DEPNO;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('获取员工信息发生错误');
END GET_EMPINFOBYDEPNO;
/
***以上两步均操作成功,问题出在第三步,我在执行这个存储过程时报错:open那行的游标变量定义错误,请高手指点
SET serveroutput ON;
DECLARE
RET_CURSOR_VALUE PKG_CONST.REF_CURSOR;
RET_EMPNO EMP.EMPNO%TYPE;
RET_ENAME EMP.ENAME%TYPE;
BEGIN
GET_EMPINFOBYDEPNO(1, RET_CURSOR_VALUE);
OPEN RET_CURSOR_VALUE ;--报游标类型有误,未解决!!!
LOOP
FETCH RET_CURSOR_VALUE
INTO RET_EMPNO, RET_ENAME;
EXIT WHEN RET_CURSOR_VALUE%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('empNo is:' || RET_EMPNO || ',empName is' ||
RET_ENAME);
END LOOP;
CLOSE RET_CURSOR_VALUE;
END;
请直接解决此问题。。用sys_refcursor搞不定。。。 展开
展开全部
1、你定义的【RET_CURSOR_VALUE】是一个光标变量,当他作为参数传入过程【GET_EMPINFOBYDEPNO】时候已经被打开(就是open...for),在主程序中再度打开是没有必要的也是错误的(且光标变量只能用【open...for】的形式打开)。
2、所以把【OPEN RET_CURSOR_VALUE】这句话删掉,就没有问题了。
*******************************
口说无凭,oracle实施log请参照:
说明:我把empno改成20了(因为表里面没有1的数据),还有把open语句注掉了。
*******************************
[SCOTT@ORA1] SQL>DECLARE
2 RET_CURSOR_VALUE PKG_CONST.REF_CURSOR;
3 RET_EMPNO EMP.EMPNO%TYPE;
4 RET_ENAME EMP.ENAME%TYPE;
5 BEGIN
6 GET_EMPINFOBYDEPNO(20, RET_CURSOR_VALUE);
7 --OPEN RET_CURSOR_VALUE ;--报游标类型有误,未解决!!!
8 LOOP
9 FETCH RET_CURSOR_VALUE
10 INTO RET_EMPNO, RET_ENAME;
11 EXIT WHEN RET_CURSOR_VALUE%NOTFOUND;
12 DBMS_OUTPUT.PUT_LINE('empNo is:' || RET_EMPNO || ',empName is' ||
13 RET_ENAME);
14 END LOOP;
15 CLOSE RET_CURSOR_VALUE;
16 END;
17 /
empNo is:7369,empName isSMITH
empNo is:7566,empName isJONES
empNo is:7902,empName isFORD
---
以上,希望对你有所帮助。
2、所以把【OPEN RET_CURSOR_VALUE】这句话删掉,就没有问题了。
*******************************
口说无凭,oracle实施log请参照:
说明:我把empno改成20了(因为表里面没有1的数据),还有把open语句注掉了。
*******************************
[SCOTT@ORA1] SQL>DECLARE
2 RET_CURSOR_VALUE PKG_CONST.REF_CURSOR;
3 RET_EMPNO EMP.EMPNO%TYPE;
4 RET_ENAME EMP.ENAME%TYPE;
5 BEGIN
6 GET_EMPINFOBYDEPNO(20, RET_CURSOR_VALUE);
7 --OPEN RET_CURSOR_VALUE ;--报游标类型有误,未解决!!!
8 LOOP
9 FETCH RET_CURSOR_VALUE
10 INTO RET_EMPNO, RET_ENAME;
11 EXIT WHEN RET_CURSOR_VALUE%NOTFOUND;
12 DBMS_OUTPUT.PUT_LINE('empNo is:' || RET_EMPNO || ',empName is' ||
13 RET_ENAME);
14 END LOOP;
15 CLOSE RET_CURSOR_VALUE;
16 END;
17 /
empNo is:7369,empName isSMITH
empNo is:7566,empName isJONES
empNo is:7902,empName isFORD
---
以上,希望对你有所帮助。
仁科信息
2024-07-24 广告
2024-07-24 广告
Oracle EBS运维是确保企业资源规划系统稳定、高效运行的关键环节。它涵盖了系统监控、性能优化、故障排查与恢复等多方面内容。通过持续的监控和数据分析,运维团队能够及时发现并解决潜在问题,保障系统的稳定性和安全性。同时,他们还需要与业务部...
点击进入详情页
本回答由仁科信息提供
展开全部
感觉你是不是简单问题复杂化了
弱ref cursor 一般用sys_refcursor去定义
弱ref cursor 一般用sys_refcursor去定义
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
本来一个PL/SQL程序块就能搞定的问题,你偏偏要加上包以及过程,没必要嘛
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询