【问题标题】:Call stored procedure in SQL Developer that returns resultset?在返回结果集的 SQL Developer 中调用存储过程?
【发布时间】:2019-11-09 15:06:37
【问题描述】:

我是 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

【问题讨论】:

    标签: plsql oracle11g oracle-sqldeveloper oracle-xe


    【解决方案1】:

    你得到了结果,你只是没有对它做任何事情。你可以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;
    

    对应用于包装器的结果进行相同的注释。

    【讨论】:

    • 谢谢。您认为可以包含一个带有select 语句的简单函数示例吗?
    • 谢谢,但我指的不是作为另一个对象包装器的函数。我指的是一个包含select 语句的函数。
    • 在你的答案中你写让它成为一个函数,或者使用一个包装函数。我假设您发布的示例是包装存储过程的包装函数。
    • 不是带有select 语句的存储过程的包装函数,而是带有select 语句的函数。
    • 我明白了;好的,我也添加了。下一步将是一个返回(流水线)表的函数,正如@ValérioCosta 所暗示的那样。
    【解决方案2】:

    您可以在工作表中运行 select 语句来查看结果。

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

    我学到的简单教程:Tutorial

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

    【讨论】:

    • 谢谢。你认为你可以包含一个简单的SELECT 语句的例子吗?
    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多