使用函数在oracle中存储游标

Posted

技术标签:

【中文标题】使用函数在oracle中存储游标【英文标题】:Using a function to store cursors in oracle 【发布时间】:2019-09-25 18:45:45 【问题描述】:

您好,所以我创建了一个包含许多游标的存储过程,并且正在使用的游标将取决于传入的变量。我的想法是通过将所有游标放在一个函数中然后返回来清理我的存储过程需要的光标。这样如果我需要创建更多的游标,我可以修改函数。

这是我的功能:

create or replace function E_P_CURSOR (p_schoolid number, p_mode number, p_d varchar2) 
return sys_refcursor
is
rf_cur   sys_refcursor;
begin

IF (p_schoolid = 2243 and p_mode = 1) then
open rf_cur for
     SELECT ..........;

return rf_cur;
end if;

end E_P_CURSOR;

但是当我尝试编译我的主程序时,它给出了一个错误。


Procedure P_DF(p_schoolid IN number, p_mode In Number)  As
 v_cursor      sys_refcursor;
....
....
BEGIN
v_cursor:= E_P_CURSOR (p_schoolid, p_mode, v_d);

FOR cur_rec IN v_cursor LOOP 
UTL_FILE.PUT_LINE(v_file,cur_rec.col1||cur_rec.col2||cur_rec.col3||cur_rec.col4||cur_rec.col5||cur_rec.col6||cur_rec.col7||cur_rec.col8);
END LOOP;  

END; 

..       

错误: [错误] PLS-00221 (671: 26): PLS-00221: 'V_CURSOR' 不是过程或未定义

....

【问题讨论】:

看看***.com/questions/42698175/… 【参考方案1】:

你缺少一个开始

Procedure P_DF(p_schoolid IN number, p_mode In Number)  As
 v_cursor      sys_refcursor;
....
BEGIN  -- ADD THIS
v_cursor:= E_P_CURSOR (p_schoolid, p_mode, v_d);

FOR cur_rec IN v_cursor LOOP 
UTL_FILE.PUT_LINE(v_file,cur_rec.col1||cur_rec.col2||cur_rec.col3||cur_rec.col4||cur_rec.col5||cur_rec.col6||cur_rec.col7||cur_rec.col8);
END LOOP;   

..       

【讨论】:

我确实有一个开始声明.. 我只是没有粘贴它

以上是关于使用函数在oracle中存储游标的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库存储过程中输出参数为自定义游标类型时,使用call或者exec调用时,用啥来给游标赋值

oracle-游标-存储过程-函数-包

PL/SQL 编程游标存储过程函数

如何在游标中调用函数,游标是oracle中另一个过程的一部分

oracle过程中游标作为输入参数 求解。。。

oracle 存储过程执行动态SQL 返回结果给游标,外部程序获得dataset结果集。