在 PL SQL 中返回游标的函数,
Posted
技术标签:
【中文标题】在 PL SQL 中返回游标的函数,【英文标题】:Function to return a cursor in PL SQL, 【发布时间】:2019-04-30 09:27:53 【问题描述】:我有一个返回 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
我是否使用了错误的数据类型?有没有其他方法可以实现我正在尝试的目标?
【问题讨论】:
【参考方案1】:您需要以不同的方式处理返回的光标;例如:
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>
【讨论】:
我的代码在一个包中,当我尝试声明一个 SYS_REFCURSOR 时,我收到错误...“PLS-00103:在预期以下之一时遇到符号“SYS_REFCURSOR”。 .等等等等” 这听起来像是包中的语法错误。您需要将答案中的匿名代码块包装到包中的适当函数或过程中。 代码 is 包装在一个过程中,这就是我在上面得到 PLS-00103 错误的地方【参考方案2】:我设法通过创建另一个(!)游标来实现我已经创建的函数(它包装了原始游标)
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
【讨论】:
以上是关于在 PL SQL 中返回游标的函数,的主要内容,如果未能解决你的问题,请参考以下文章