在 SQL 开发人员 returns 结果集中调用存储过程?

Call stored procedure in SQL Developer that returns resultset?

我是 Oracle 的新手,所以请多多包涵。我一直在搜索,但我还没有找到直接的答案。

SQL Developer中,我创建了以下存储过程。我假设它的创建是因为它 returns 消息 Procedure ORACLE_GET_TOP_N_TESTS compiled:

create procedure oracle_get_top_n_tests
(oracle_tests OUT SYS_REFCURSOR) 
AS 
BEGIN 
OPEN oracle_tests FOR
select * from sales.quiz_results;
END oracle_get_top_n_tests;
/

现在我想call/execute存储过程查看结果集(select语句)。我试过以下方法,但没有看到结果集:

variable mycursor refcursor;
exec oracle_get_top_n_tests ( :mycursor );

/* Received message PL/SQL procedure successfully completed, but no result */

我做错了什么?

我用Database 11g Express Edition.

您只需运行工作表中的select语句即可查看结果。

如果你想要一个返回结果集的对象,我会使用一个 returns a table

的函数

我学到的简单教程:Tutorial

那么您只需 运行 工作表中的语句 select * from table(function_oracle_get_top_n_tests);

您正在获得结果,只是您没有对其进行任何操作。你可以print它:

variable mycursor refcursor;
exec oracle_get_top_n_tests ( :mycursor );
print mycursor

输出将进入脚本输出 window,而不是网格。 (您需要将其设为函数,或 use a wrapper function,以在网格中获取输出,即使这样,查看它们也需要额外的步骤。)


简单包装函数:

create function oracle_get_top_n_tests_wrapper
RETURN SYS_REFCURSOR
AS
  oracle_tests SYS_REFCURSOR;
BEGIN
  oracle_get_top_n_tests (oracle_tests => oracle_tests);

  return oracle_tests;
END oracle_get_top_n_tests_wrapper;
/

然后称其为:

select oracle_get_top_n_tests_wrapper from dual;

如果您运行将其作为脚本,那么结果仍将进入脚本输出window;如果你 运行 它作为一个声明,那么它们将进入结果网格,但作为一个单一的 row/column,你可以展开它以查看实际内容。


如果您没有被过程所困,那么您可以将其替换为函数,这样就不需要包装器了:

-- drop function oracle_get_top_n_tests_wrapper
-- drop procedure oracle_get_top_n_tests

create function oracle_get_top_n_tests
RETURN SYS_REFCURSOR
AS
  oracle_tests SYS_REFCURSOR;
BEGIN
  OPEN oracle_tests FOR
  select * from sales.quiz_results;

  return oracle_tests;
END oracle_get_top_n_tests;
/

然后直接调用:

select oracle_get_top_n_tests from dual;

与应用于包装的结果相同的注释。