在存储过程中使用“out”ref_cursor 调用 Oracle 存储过程

Posted

技术标签:

【中文标题】在存储过程中使用“out”ref_cursor 调用 Oracle 存储过程【英文标题】:Calling an Oracle stored proc with "out" ref_cursor within a stored proc 【发布时间】:2014-03-25 20:25:41 【问题描述】:

我试图基本上在存储过程中调用一组 Oracle 存储过程。只要我的 proc 不返回记录集并采用“in”参数,我就可以了;但是,其中一个存储过程具有 sys_refcursor 的“out”参数。调用内部过程也可以正常工作,但是一旦我用一些参与逻辑将它们包装起来,我就会遇到问题。

具体来说,我收到以下错误:

Error starting at line 2 in command: 
EXECUTE CRU_MY_PROCESS_EXPORT (1,'EAST',P_RECORDSET => :RC) 
Error report: 
Cursor is closed. RC

这里是存储过程:

1 create or replace PROCEDURE CRU_MY_PROCESS_EXPORT ( 
2   P_ID_NR IN NUMBER,
3   P_ENVIRONMENT IN VARCHAR,
4   P_RECORDSET OUT SYS_REFCURSOR ) AS
5
6    V_DB_SOURCE_ID NUMBER :=1;
7    V_REC SYS_REFCURSOR;
8
9   BEGIN
10     IF P_ENVIRONMENT = 'WEST' THEN
11      R_MY_PROCESS_SYNC_WEST(V_DB_SOURCE_ID, P_ID_NR);
12    END IF;  
13
14    IF P_ENVIRONMENT = 'EAST' THEN
15      R_MY_PROCESS_SYNC_EAST(V_DB_SOURCE_ID); 
16    END IF; 
17
18   --following proc call takes 'out' sys_refcursor as well
19   R_MY_PROCESS_EXPORT_ALL(V_REC);  
20     
21 END CRU_MY_PROCESS_EXPORT;

所以,任何帮助,建议将不胜感激!

回答 感谢所有帮助我思考这个问题的人......将参数为“V_REC”的第 19 行更改为“P_RECORDSET”就是答案。

【问题讨论】:

你似乎没有填充P_RECORDSET;你应该传递 R_MY_PROCESS_EXPORT_ALL 而不是 V_REC 吗? @Alex Poole:我编辑了上面的过程以供参考。对...所以,我尝试将我的 p_recordset 传递给 R_MY_PROCESS_EXPORT_ALL(p_recordset) 但它不会编译,因为这个内部过程需要一个' out' 参数。 好吧……我现在觉得很傻……我想我累了……我从上面的参数中传入了 p_recordset,现在它可以工作了……呃! 【参考方案1】:

我看不到你在用你的P_RECORDSET 参数做任何事情。如果调用者希望你返回一个打开的游标,你需要返回一个打开的游标。

我的预感是你不想声明一个v_rec 局部变量并且你想将p_recordset 传递给r_my_process_export_all,我猜它也有一个OUT 类型的参数@ 987654326@.

【讨论】:

嗨,贾斯汀,我不确定我在想什么……我想我一直在玩这个,我有错误的语法……我只是按照你的建议做了,它奏效了!谢谢!

以上是关于在存储过程中使用“out”ref_cursor 调用 Oracle 存储过程的主要内容,如果未能解决你的问题,请参考以下文章

mysql 存储过程

MySQL 存储过程传参之in, out, inout 参数用法

TOAD 显示存储过程返回的游标记录集

未知方言支持 REF_CURSOR 参数

过程与函数

Oracle 编程