2016-01-04 126 views
0

我想知道如何從oracle中的stored procedure返回嵌套表以便在我的.net客戶機中使用。

基本上我使用以下格式,用於創建嵌套表:

從存儲過程返回嵌套表

TYPE changes IS RECORD(
    col1 VARCHAR2(20), 
    col2 VARCHAR2(20), 
    col3 VARCHAR2(20) 
); 

TYPE collection is table of changes; 

我正在與在存儲過程中的邏輯值填充該。

現在我想爲我的.net客戶端返回這些值。
我們可以嘗試將嵌套表格值轉儲到光標並返回。如果是,那麼如何?

回答

0

首先,如果使用ODP.net,則知道您可以在程序和您的UI之間使用directly pass collection types。這是挑剔的,但它的作品。

如果您想簡單地將集合轉儲到要返回的遊標中,請查看TABLE()函數。在您的例子,你可以傳回一個ref_cursor的UI使用類似的遍歷(原諒任何輕微的語法故障 - 我是從我的數據庫離開的那一刻):

FUNCTION collection_to_cursor 
return sys_refcursor 
IS 
    p_cursor sys_refcursor; 
    p_change changes; 
BEGIN 
Open p_cursor for (
    SELECT col1, col2, col3 
    FROM TABLE(p_change)); 
RETURN p_cursor; 
end; 
0

你可以使用一個引用遊標,東西沿線

DECLARE 
lt_collection collection := collection(); 
lrc_collection SYS_REFCURSOR; 

BEGIN 

lt_collection := f_populate_collection_somehow; 

OPEN lrc_collection 
SELECT col1 
     ,col2 
     ,col3 
FROM TABLE(CAST(lt_collection AS collection)); 


END; 

.NET可以然後從ref光標檢索數據,我不確定如何完成這些細節。

有使用引用遊標或關聯數組 here

0

請注意一些好進一步的信息,我不熟悉.NET,所以我從字面上寫這封信,你的問題:「我怎麼能返回一個嵌套oracle中的存儲過程中的表「。 我不確定「在我的.net客戶端中使用」部分,因爲我不確定是否可以直接在.net代碼中使用返回的記錄類型/表類型。

我做了一些研究,我學到的是在任何oracle客戶端界面中都沒有對記錄類型的直接支持。人們通常會做的是圍繞從函數返回的表類型創建一個包裝過程,以將其轉換爲引用遊標並在自定義代碼中使用引用遊標。

CREATE OR REPLACE TYPE changes AS OBJECT(
    col1 VARCHAR2(20), 
    col2 VARCHAR2(20), 
    col3 VARCHAR2(20) 
); 

CREATE OR REPLACE TYPE collection is table of changes; 

CREATE OR REPLACE PACKAGE test_pkg AS 
    FUNCTION test_fn RETURN collection; 
END test_pkg; 

CREATE OR REPLACE PACKAGE BODY test_pkg 
AS 
    FUNCTION test_fn RETURN collection AS 
    l_collection collection; 
    BEGIN 
    l_collection := collection(); 
    l_collection.EXTEND; 
    l_collection(l_collection.LAST) := changes('Subhasis','Mukherjee','Male'); 
    RETURN l_collection; 
    END test_fn; 
END test_pkg; 


SELECT * FROM table(test_pkg.test_fn) 

col1    col2    col3 
-----------  -------------  -------------- 
Subhasis   Mukherjee   Male