cod*_*441 5 sql database oracle plsql sys-refcursor
我正在执行以下操作,但它不起作用
select package_name.function_name(param,param) from dual
Run Code Online (Sandbox Code Playgroud)
我正在调用一个返回光标的函数,所以我猜这"from dual"
就是问题所在
还有另一种方法吗?
我猜你指的是参考光标。这是一个 PL/SQL 构造,充当指向查询返回的一组记录的指针。这意味着它必须由运行查询的客户端来解释。例如,我们可以将引用游标映射到 JDBC 或 ODBC 结果集。
你的基本说法当然没有问题。这是一个与您自己的函数类似的函数:
SQL> desc get_emps
FUNCTION get_emps RETURNS REF CURSOR
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
P_DNO NUMBER(2) IN
P_SORT_COL VARCHAR2 IN DEFAULT
P_ASC_DESC VARCHAR2 IN DEFAULT
SQL>
Run Code Online (Sandbox Code Playgroud)
我可以轻松地在更广泛的 PL/SQL 块中调用它:
SQL> declare
2 rc sys_refcursor;
3 begin
4 rc := get_emps(50);
5 end;
6 /
PL/SQL procedure successfully completed.
SQL>
Run Code Online (Sandbox Code Playgroud)
然而,SQL*PLus 可以本地处理 CURSOR 结构:
SQL> select get_emps(50) from dual
2 /
GET_EMPS(50)
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
8060 VERREYNNE PLUMBER 8061 08-APR-08 4000 50
8061 FEUERSTEIN PLUMBER 7839 27-FEB-10 4500 50
8085 TRICHLER PLUMBER 8061 08-APR-10 3500 50
8100 PODER PLUMBER 8061 3750 50
SQL>
Run Code Online (Sandbox Code Playgroud)
该语句也在 SQL Developer 中运行,尽管结果集的布局很丑陋。
因此,如果您的功能出现问题,那么问题是:
阅读了有关此主题的其他问题后,我认为问题可能是由于使用用户定义的参考光标(而不是内置的)造成的。不过,这没有什么区别。这个封装好的函数:
SQL> create or replace package emp_rc_utils as
2
3 type emp_rc is ref cursor return emp%rowtype;
4
5 function get_emps
6 ( p_dno in emp.deptno%type
7 )
8 return emp_rc;
9 end;
10 /
Package created.
SQL> create or replace package body emp_rc_utils as
2
3 function get_emps
4 ( p_dno in emp.deptno%type
5 )
6 return emp_rc
7 is
8 return_value emp_rc_utils.emp_rc;
9 begin
10
11 open return_value for select * from emp where deptno = p_dno;
12
13 return return_value;
14 end get_emps;
15
16 end emp_rc_utils;
17 /
Package body created.
SQL>
Run Code Online (Sandbox Code Playgroud)
仍然有效...
SQL> declare
2 rc sys_refcursor;
3 begin
4 rc := emp_rc_utils.get_emps(50);
5 end;
6 /
PL/SQL procedure successfully completed.
SQL> select emp_rc_utils.get_emps(50) from dual
2 /
EMP_RC_UTILS.GET_EMP
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
8085 TRICHLER PLUMBER 8061 08-APR-10 3500 50
8060 VERREYNNE PLUMBER 8061 08-APR-08 4000 50
8061 FEUERSTEIN PLUMBER 7839 27-FEB-10 4500 50
8100 PODER PLUMBER 8061 3750 50
SQL>
Run Code Online (Sandbox Code Playgroud)