在SQL Developer中调用存储过程返回结果集吗?

时间:2019-06-27 14:48:09

标签: plsql oracle11g oracle-sqldeveloper oracle-xe

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

SQL Developer中,我创建了以下存储过程。我认为它是创建的,因为它返回了消息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;
/

现在,我想调用/执行存储过程以查看结果集(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

2 个答案:

答案 0 :(得分:3)

您正在得到结果,您只是没有做任何事情。您可以print

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

输出将进入脚本输出窗口,而不是网格。 (您需要将其设为一个函数或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;

如果将其作为脚本运行,则结果仍将显示在脚本输出窗口中;如果您将其作为语句运行,则它们将进入结果网格,但会以单个行/列的形式出现,您可以对其进行扩展以查看实际内容。


如果您不喜欢某个过程,则可以将其替换为一个函数,这样就不需要包装器了。

-- 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;

对应用于包装程序的结果具有相同的注释。

答案 1 :(得分:0)

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

如果您想要一个对象返回结果集,我将使用一个返回表的函数

一个简单的教程,我从中学到了:Tutorial

然后您只需运行工作表select * from table(function_oracle_get_top_n_tests);

中的语句