【问题标题】:How to call Oracle function which has SYS_REFCURSOR as OUT Parameter如何调用以 SYS_REFCURSOR 作为 OUT 参数的 Oracle 函数
【发布时间】:2012-11-27 07:57:09
【问题描述】:
create or replace
FUNCTION test_fun (
p_ref_cur               OUT SYS_REFCURSOR,
p_a_code            IN  NUMBER                                  DEFAULT 0,
p_category          IN  package.category%TYPE           DEFAULT NULL,
p_name              IN  package.name%TYPE           DEFAULT NULL,
p_display_name      IN  package.display_name%TYPE   DEFAULT NULL,
p_rowid             IN  package."rowid"%TYPE                DEFAULT NULL,
p_flg               IN  package.flg%TYPE                DEFAULT '1',
p_mod_dat           IN  package.mod_dat%TYPE            DEFAULT SYSTIMESTAMP,
p_mod_usr           IN  package.mod_usr%TYPE            DEFAULT NULL
)
RETURN NUMBER
AS

如何在以SYS_REFCURSOR为OUT参数的oracle中调用该函数?

更新: **test_fun** 将从另一个函数调用,例如 caller(),其中要执行的完整函数将从数据库中获取并使用 execute immediate 命令执行。

SELECT command into cmd from data_table where id=p_id;
execute immediate (cmd);

cmd 值会像

test_fun(v_cv1,0, 'pp', 'np123', 'np', NULL, 1, NULL, 'testuser');

注意:我们可以控制 caller() 函数和要执行的 cmd,但无法控制 test_fun()

非常感谢任何帮助。

【问题讨论】:

  • 不将游标声明为 IN OUT 有什么具体原因吗?
  • 就是这样。我无法控制它。
  • 您使用的是哪个 SQL 客户端?引用游标的处理非常客户端特定。

标签: sql oracle call sql-function


【解决方案1】:

只需在调用块中声明一个 SYS_REFCURSOR 类型的变量,然后调用您的函数,例如来自 SQL/Plus:

 set autoprint on;
 var cur refcursor;

 declare
      FUNCTION test_fun (
        p_ref_cur               OUT SYS_REFCURSOR)
      RETURN NUMBER is
      begin
        open p_ref_cur for select * from dual;
        return 1;
      end;

 begin
     dbms_output.put_line(test_fun(:cur));
 end;
 /

【讨论】:

    【解决方案2】:

    这个过程很神奇

      PROCEDURE executecmd(cmd_in IN VARCHAR2)
              AS
              v_cv1 SYS_REFCURSOR;
              BEGIN
                     dbms_output.put_line('Executing cmd: '|| cmd);
    
                     execute immediate 'declare
                        result number;
                       BEGIN
                        result:='||cmd_in||';'||
                       'END;'
                       USING v_cv1;
              END;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多