Plsql
你如何通過參考游標輸出一個plsql數組
我有一個將 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