gpt4 book ai didi

sql - 如何调用包中的函数

转载 作者:搜寻专家 更新时间:2023-10-30 19:46:53 30 4
gpt4 key购买 nike

我正在执行以下操作,但它不起作用

select package_name.function_name(param,param) from dual

我正在调用一个返回游标的函数,所以我猜 "from dual" 是问题所在

还有其他方法吗?

最佳答案

我猜你指的是 Ref Cursor。这是一个 PL/SQL 结构,用作指向查询返回的一组记录的指针。这意味着它必须由运行查询的客户端解释。例如,我们可以将 Ref Cursor 映射到 JDBC 或 ODBC ResultSet。

你的基本陈述肯定没有错。这是一个类似于您自己的函数:

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>

我可以轻松地在更广泛的 PL/SQL block 中调用它:

SQL> declare
2 rc sys_refcursor;
3 begin
4 rc := get_emps(50);
5 end;
6 /

PL/SQL procedure successfully completed.

SQL>

但是,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>

此语句也在 SQL Developer 中运行,尽管结果集的布局丑陋

因此,如果您的函数有问题,问题是:

  1. 您使用的是什么客户端环境?
  2. 它“不起作用”的确切方式是什么?请描述观察到的行为,包括任何错误信息?
  3. 同时向我们提供环境详细信息,例如数据库版本、操作系统等。

在阅读了关于该主题的其他问题后,我认为问题可能是由于使用了用户定义的引用游标(而不是内置的)。但是,这没有任何区别。这个封装函数:

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>

仍然有效...

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>

关于sql - 如何调用包中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4614475/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com