我来自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;
答案 0 :(得分:0)
“运行”对话框是从过程规范生成的,因此知道testcursor
的正确类型,但是当您将其粘贴到工作表中时它不会,并且似乎将其定义为文本字符串。从SQL Developer 4.0.3.16开始,工作表绑定值提示似乎没有办法更改数据类型。
至于如何在SQL Dev中使用游标输出创建可重用的测试脚本,我不知道。 (我通常使用可以执行此操作的PL / SQL Developer,但它不是免费软件。)
编辑:在这个线程中,一个解决方案是编写一个包装器函数并从dual中选择它。我刚试过,你没有得到一个网格,但你得到一种调试输出而不需要太多努力: