2016-01-04 3 views
0

Я хотел бы знать, как я могу вернуть вложенную таблицу из stored procedure в oracle, чтобы потреблять в моем .net клиенте.

В основном я использовал следующий формат для создания вложенной таблицы:

Возврат вложенной таблицы из хранимой процедуры

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

TYPE collection is table of changes; 

Я заселение это со значениями в хранимой процедуре логики.

Теперь я хочу вернуть эти значения для моего .net-клиента.
Можем ли мы попытаться сбросить вложенные значения таблиц в курсор и вернуться назад. Если да, то как?

ответ

0

Прежде всего, если вы используете ODP.net, то знаете, что вы можете directly pass collection types между процедурой и вашим пользовательским интерфейсом. Это неуловимо, но это работает.

Если вы хотите просто выгрузить коллекцию в возвращаемый курсор, посмотрите на функцию TABLE(). В вашем примере вы можете передать обратно ref_cursor для пользовательского интерфейса для обхода, используя что-то вроде (простите любые незначительные синтаксические глюков - я от моей базы данных на данный момент):

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 может затем получить данные с реф курсором, я не уверен в деталях, как это делается.

Существует несколько хороших дополнительная информация об использовании реф курсоров или ассоциативные массивы here

0

Пожалуйста, обратите внимание, что я не знаком с .NET, так что я пишу это буквально на ваш вопрос «как я могу вернуть вложенное таблицу из хранимой процедуры в оракуле ". Я не уверен в том, что «потреблять в моем .net-клиенте» часть, так как я не уверен, что тип/тип возвращаемого типа записи может быть непосредственно использован в .net-коде.

Я провел некоторое исследование и узнал, что нет прямой поддержки типа записи в любом клиентском интерфейсе oracle. Что обычно делают люди, так это создать процедуру обертки вокруг возвращаемого типа таблицы из функции, чтобы преобразовать ее в курсор ref и использовать курсор ref в пользовательском коде.

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 
Смежные вопросы