SYS_REFCURSOR输出参数 - 运行存储过程失败

时间:2016-07-19 15:53:50

标签: oracle plsql oracle-sqldeveloper oracle12c

我来自SQL Server背景,但我在Oracle中苦苦挣扎。数据库中已配置的所有sprocs都需要传入类型为' sys_refcursor'的参数。简而言之,他们这样做(sprocs要复杂得多,但整个光标就是我所得到的):

CREATE OR REPLACE PROCEDURE xxx_API_TEST 
(
  TESTCURSOR OUT SYS_REFCURSOR 
) AS 
BEGIN
  OPEN CURS FOR
  SELECT * FROM SOMETABLE;
END xxx_API_TEST;

所以 - 在Oracle SQL Developer中我可以运行这个没问题 - 并在Output Variables窗口中查看光标的输出。

但是,每次我想重新测试时都不必继续重新加载对话框 - 我认为可以将对话框中的PL / SQL复制到新工作表中,然后将其作为我需要 - 调整参数以适应 - 所以在这种情况下,我运行:

    DECLARE
      TESTCURSOR SYS_REFCURSOR;
    BEGIN

      xxx_API_TEST(
        TESTCURSOR => TESTCURSOR 
      );
      /* Legacy output: 
    DBMS_OUTPUT.PUT_LINE('TESTCURSOR = ' || TESTCURSOR );
    */ 
      :TESTCURSOR := TESTCURSOR; --<-- Cursor
    --rollback; 
    END;

与“运行”对话框中显示的内容完全相同。

但是,如果我这样做 - 它只会引发错误 - 说明:

Error starting at line : 1 in command -
<snip>
Error report -
ORA-06550: line 11, column 20:
PLS-00382: expression is of wrong type
ORA-06550: line 11, column 3:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

我不知道怎么去诊断这个。从对话框而不是工作表中运行良好的事实令人费解 - 并且检查发送给数据库的内容我无法看到它实际使用的SQL的任何差异。

有趣的是,如果我从工作表中运行此代码 - 它会弹出一个对话框,询问TESTCURSOR的值 - &#39;运行&#39;对话框不起作用。我只是按下确定 - 但是我已经尝试过勾选和解开“Null&#39;复选框无济于事。

非常感谢任何帮助。它是Oracle 12c。如果您需要更多信息,请告诉我。

干杯, 贝

更新:2016年7月20日

我最终将值从fetch中拉入变量,然后转储到dbms_output - 这给了我重复运行相同sproc所需的内容。  例如

loop 
    fetch testcursor into Res, ActDate<snip>;  

    exit when testcursor%notfound;  

    DBMS_OUTPUT.PUT_LINE(Res || ' | ' || ActDate etc etc);  

  end loop;  
  close testcursor;

1 个答案:

答案 0 :(得分:0)

“运行”对话框是从过程规范生成的,因此知道testcursor的正确类型,但是当您将其粘贴到工作表中时它不会,并且似乎将其定义为文本字符串。从SQL Developer 4.0.3.16开始,工作表绑定值提示似乎没有办法更改数据类型。

至于如何在SQL Dev中使用游标输出创建可重用的测试脚本,我不知道。 (我通常使用可以执行此操作的PL / SQL Developer,但它不是免费软件。)

编辑:在这个线程中,一个解决方案是编写一个包装器函数并从dual中选择它。我刚试过,你没有得到一个网格,但你得到一种调试输出而不需要太多努力:

Oracle SQL Developer: Show REFCURSOR Results in Grid?