【问题标题】:How to get array result from Oracle stored procedure如何从 Oracle 存储过程中获取数组结果
【发布时间】:2012-02-11 18:33:06
【问题描述】:

我试图在互联网上找到它,但我可以在任何地方找到它。 我想要 Oracle 存储过程类似于:

CREATE OR REPLACE PROCEDURE Read()
IS
   BEGIN
         SELECT * FROM Books;   
   END;
/

这将使我成为结果和数组。所以我想检索这个 oracle 存储过程的 PHP 数组结果。请问可以修改吗? 那么当我在 php 中获取数组时,我可以轻松地获取数据吗? 提前谢谢!

【问题讨论】:

    标签: php sql oracle stored-procedures


    【解决方案1】:

    我怀疑你不想返回一个数组。相反,我怀疑您希望您的存储过程返回 REF CURSOR

    CREATE OR REPLACE PROCEDURE Read( p_rc OUT SYS_REFCURSOR )
    AS
    BEGIN
      OPEN p_rc
       FOR SELECT *
             FROM books;
    END;
    

    如果你真的想从 PL/SQL 返回一个数组(这将在服务器上使用更多的 PGA 空间以及其他资源),你可以这样做

    CREATE TYPE book_typ 
        AS OBJECT (
      <<list of columns in BOOKS>>
    );
    
    CREATE TYPE book_tbl 
        AS TABLE OF book_typ;
    
    CREATE OR REPLACE PROCEDURE Read( p_arr OUT book_tbl )
    AS
    BEGIN
       SELECT <<list of columns>>
         BULK COLLECT INTO p_arr
         FROM books;
    END;
    

    以这种方式构造代码而不是返回REF CURSOR 几乎是没有意义的。它的效率会低得多,使用更多的服务器资源,使其可扩展性大大降低等。此外,还有多种方法可以直接在 PL/SQL 中生成 XML。

    【讨论】:

    • 问题是我真的想返回一个数组,因为我有读取数组并将其转换为 XML 的类,我已经看到了这个用于光标的东西。是否可以对数组而不是光标执行此操作?
    • @Denmonth - 我扩展了我的答案以包括一种将 PL/SQL 数组作为输出参数的方法。
    • 谢谢先生,我明天试试,现在太晚了。我会将其标记为已回答!
    • 是否有可能返回游标(我在OPEN p_rc AS 附近遇到错误,更具体地说,它说它正在预期的 AS 语句。(或类似的东西,然后将游标转换为数据数组?所以我不浪费很多资源?这个&lt;&lt;list of columns in BOOKS&gt;&gt;你的意思是我只是把所有的列分开。用,?谢谢
    • @Denonth - 抱歉,我发布的代码中存在语法错误。它应该是 FOR 而不是 OPEN 中的 AS。我更正了。
    猜你喜欢
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 2020-10-23
    • 2016-10-21
    • 2020-02-18
    • 2023-03-28
    • 2011-11-25
    • 1970-01-01
    相关资源
    最近更新 更多