【问题标题】:pl/sql how to return a SELECT query result setpl/sql如何返回一个SELECT查询结果集
【发布时间】:2020-04-08 18:10:56
【问题描述】:

我正在尝试在 oracle 中编写一个存储过程,它采用 IN 参数并将其用作 SELECT 查询的一部分。我想返回一个结果集,就像我只是简单地运行 SELECT * FROM table where id = 1; 但是我似乎找不到任何方法来做到这一点?

我查看了 sys_refcursor、dbms_sql.return_result 和其他一些,但这些要么只编译,要么编译并将输出返回到控制台,而不是作为查询结果集。

以下过程的简单示例

CREATE OR REPLACE PROCEDURE myProc
(
     v_id IN table.id%TYPE;
)
AS

BEGIN
     --desired query
     SELECT * FROM table WHERE id = v_id;

     --sys_refcursor which only prints to console
     open c1 for
       select * from table where id=v_id;
     dbms_sql.return_result(c1);

     --execute immediate does not return any results set
     execute immediate 'SELECT * FROM table WHERE id = v_id';
END;

对于如何实现这一点,还有其他建议或想法吗? 注意:我不希望处理结果,这就是我不使用 INTO 子句的原因,即使我确实使用了它也不会返回结果集。

【问题讨论】:

  • 如果您不想处理结果,那您为什么还要执行 SQL 呢?您希望您的程序返回结果吗?你的程序是从哪里调用的?
  • 这能回答你的问题吗? Get resultset from oracle stored procedure
  • @gsalem 是的,我希望程序返回结果。我正在将程序从 sybase 迁移到 oracle。我相信由此产生的结果集作为 dbservice 的一部分包含在 java 对象中
  • @Serg 感谢我之前没有看到的链接。看起来那里的解决方案似乎专注于 sql plus/functions/dbms_output。不幸的是,这两种方法都不适合我的具体情况

标签: sql oracle stored-procedures plsql oracle-sqldeveloper


【解决方案1】:

Sys_refcursor 就是你所需要的,因为它将结果返回给应用程序 -

CREATE OR REPLACE PROCEDURE myProc
(
     v_id IN table.id%TYPE,
     P_Result OUT SYS_REFCURSOR
)
AS

BEGIN
     --desired query
     OPEN P_Result FOR
     SELECT *
     FROM table WHERE id = v_id;
END;

然后应该从另一个块调用此过程 -

DECLARE
result SYS_REFCURSOR;
BEGIN
    myProc(your_ID, result);
END;

【讨论】:

  • 试过了,控制台说的都编译成功了。这会将结果集保存在一个变量中,它实际上并没有将其作为“查询结果”返回
  • Sys_refcursor 不会在查询中返回您的结果。您必须在过程中使用它才能返回数据。
  • 如何在 proc 内部使用它来返回并将结果显示为“查询结果”而不使用 dbms_sql 或 dbms_output?
  • 你用的是哪个sql工具?
  • 您需要在 sqlplus、流水线函数或您使用的任何开发工具中处理过程的结果。它称为测试。您验证此组件是否按预期/必要工作。如果您在使用 Java 服务时遇到问题,您就知道问题出在 Java 代码或接口/连接中。您不会花费数小时或数天的时间查看完美且正确的 plsql 代码来试图找到错误。
猜你喜欢
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
相关资源
最近更新 更多