Plsql

你如何通過參考游標輸出一個plsql數組

  • May 14, 2018

我有一個將 plsql assoc 表返回到 C++ DLL 的遺留過程。現在我需要通過 C# 和 ODP.NET 呼叫它。我一直無法找到有關如何呼叫返回 pl/sql assoc 數組的 proc 的任何資訊(大量關於如何將數據發送到作為輸入的數據)。

認為如果我可以讓 proc 返回一個 ref 游標,那麼這應該不是問題,因為我已經做了很多次了

但是,還沒有找到這樣做的例子,所有嘗試都失敗了。

歡迎任何幫助。

下面的程式碼。它提供一個 orderid 作為輸入。它呼叫另一個 proc relOrders,它返回一個放入 pl sql 表中的數組。

TYPE tab_number12 IS TABLE OF NUMBER (12)
     INDEX BY BINARY_INTEGER;

PROCEDURE GetOrders (p_Orderid          IN     NUMBER,
                                   p_subOrderIds            OUT tab_number12)
  IS
     allOrder   DBMS_SQL.number_table;

  BEGIN
     allOrder (1) := p_Orderid;

     relOrders (allOrder);

     FOR i IN allOrder.FIRST .. allOrder.LAST
     LOOP
        p_subOrderIds (i) := allOrder (i);
     END LOOP;
  END;

我也找不到一個例子,所以我編造了這個:

CREATE TYPE t_tf_row AS OBJECT (
 id           varchar2(20),
 description  VARCHAR2(50)
);
/
CREATE TYPE t_tf_tab IS TABLE OF t_tf_row;
/

create or replace package aa2rc as
 FUNCTION get_tab_ptf
   RETURN t_tf_tab PIPELINED;
 PROCEDURE GetOrders (
   p_Orderid     IN  NUMBER,
   p_subOrderIds OUT sys_refcursor);
end aa2rc;
/

create or replace package body aa2rc as
 type allOrder_t is table of varchar2(50) index by varchar2(20);

 allOrder allOrder_t;

 FUNCTION get_tab_ptf
   RETURN t_tf_tab PIPELINED AS
   i varchar2(20);
   BEGIN
         i := allOrder.first;
         while (i is not null) loop
           PIPE ROW(t_tf_row(i, allOrder(i)));
           i := allOrder.next(i);
         END LOOP;

         RETURN;
   END;

 PROCEDURE GetOrders (
   p_Orderid     IN  NUMBER,
   p_subOrderIds OUT sys_refcursor)
   IS

     procedure relorders (p_ord in out allOrder_t) is
       i number;
       begin
         for i in 1 .. 11 loop
           p_ord('Index no. ' || (p_ord('One') + i))
             := 'Value ' || (p_ord('One') + i);
         end loop;
       end;

   BEGIN
     allOrder ('One') := p_Orderid;

     relOrders (allOrder);

     open p_suborderids for
       select * from table(aa2rc.get_tab_ptf);
   END;
end aa2rc;
/

我對 C# 不是那麼敏銳,但用 sqlplus 進行了測試:

variable R refcursor
execute aa2rc.getorders(5,:r);
print r

這給了:

ID                   DESCRIPTION
-------------------- --------------------------------------------------
Index no. 10         Value 10
Index no. 11         Value 11
Index no. 12         Value 12
Index no. 13         Value 13
Index no. 14         Value 14
Index no. 15         Value 15
Index no. 16         Value 16
Index no. 6          Value 6
Index no. 7          Value 7
Index no. 8          Value 8
Index no. 9          Value 9
One                  5

引用自:https://dba.stackexchange.com/questions/206613