Plsql 调用SQL Developer中返回结果集的存储过程?

Plsql 调用SQL Developer中返回结果集的存储过程?,plsql,oracle11g,oracle-sqldeveloper,oracle-xe,Plsql,Oracle11g,Oracle Sqldeveloper,Oracle Xe,我是甲骨文的新手,所以请容忍我。我一直在寻找,但我还没有找到一个直接的答案 在sqldeveloper中,我创建了以下存储过程。我假设创建它是因为它返回消息过程ORACLE\u GET\u TOP\u N\u TESTS compiled: create procedure oracle_get_top_n_tests (oracle_tests OUT SYS_REFCURSOR) AS BEGIN OPEN oracle_tests FOR select * from sales.qu

我是甲骨文的新手,所以请容忍我。我一直在寻找,但我还没有找到一个直接的答案

sqldeveloper
中,我创建了以下存储过程。我假设创建它是因为它返回消息
过程ORACLE\u GET\u TOP\u N\u 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

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

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

我从中了解到的简单教程:


然后,您只需运行工作表
select*from表中的语句(function\u oracle\u get\u top\u n\u tests)

你得到了结果,但你没有用它做任何事情。你可以:

输出将进入脚本输出窗口,而不是网格。(您需要将其设置为一个函数,或者在网格中获取输出,即使这样,还需要额外的步骤来查看它们。)


简单包装器函数:

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;

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

谢谢。您认为您可以用一个简单的
SELECT
语句包含一个示例吗?谢谢。你认为可以用一个带有
select
语句的函数的简单示例吗?谢谢,但我指的不是一个充当另一个对象包装器的函数。我指的是一个包含
select
语句的函数。在您的回答中,您可以编写make它为函数,或者使用包装器函数。我假设您发布的示例是一个包装存储过程的包装函数。它不是包含
select
语句的存储过程的包装函数,而是包含
select
语句的函数;好的,我也加了这个。下一步是返回一个(流水线)表的函数,正如@ValérioCosta所提到的。
select oracle_get_top_n_tests from dual;