我有一个返回SYS_REFCURSOR的函数,该函数将从不同的包中调用,我们不想在多个位置重复游标定义。
FUNCTION f_get_cur(p_date DATE, p_code VARCHAR(10)) RETURN SYS_REFCURSOR IS
cur_s SYS_REFCURSOR;
BEGIN
OPEN cur_s FOR
SELECT .blah blah etc etc
return cur_s;
END f_get_cur;
哪个可以编译,但是当我想在通常要放置光标的FOR LOOP中使用该函数时,会出现以下错误
错误:PLS-00456:项目'f_get_cur'不是光标
我正试图像这样打开游标...
FOR cc_rec IN f_get_cur(c_date, p_c_code) LOOP
我使用的数据类型错误吗?还有其他实现我正在尝试的方法的方法吗?
答案 0 :(得分:4)
您需要以其他方式处理返回的游标;例如:
SQL> create or replace FUNCTION f_get_cur(p_date DATE, p_code VARCHAR) RETURN SYS_REFCURSOR IS
2 cur_s SYS_REFCURSOR;
3 BEGIN
4 OPEN cur_s FOR
5 SELECT to_char(p_date, 'dd-mm-yyyy') || p_code val from dual;
6
7 return cur_s;
8 END f_get_cur;
9 /
Function created.
SQL> declare
2 cur_s SYS_REFCURSOR;
3 v varchar2(100);
4 begin
5 cur_s := f_get_cur(sysdate, 'xx');
6 loop
7 fetch cur_s into v;
8 exit when cur_s%NOTFOUND;
9 dbms_output.put_line(v);
10 end loop;
11 end;
12 /
30-04-2019xx
PL/SQL procedure successfully completed.
SQL>
答案 1 :(得分:0)
我设法通过创建另一个(!)游标来实现此功能,该游标实现了我已经创建的功能(包装了原始游标)
cursor cur_real(cp_date DATE, cd_code VARCHAR2(10)) IS
select ... etc
FROM TABLE(f_get_cur(cp_date, cp_code));
我现在可以像这样使用光标
FOR cc_rec IN f_get_cur(c_date, p_c_code) LOOP
do stuff ... etc
END LOOP