2013-09-20 8 views
1

У меня есть функция Func_A, которая возвращает переменную таблицы. Теперь я хочу создать другую функцию Func_B, которая вызывает Func_A несколько раз и возвращает все результаты Func_A в сочетании. Но возвращается только последний результат Func_A. Как объединить все результаты функции a вместе?PLSQL - переменные таблицы слияния

CREATE TYPE RowType AS OBJECT (ItemNumber int, ItemName varchar2(255)); 
/
CREATE TYPE TableType AS TABLE OF RowType; 
/

create or replace 
FUNCTION Func_A (v_test int) 
RETURN TableType AS 
v_result TableType := TableType(); 
BEGIN 
    FOR i IN 1..5 LOOP 
    v_result.extend; 
    v_result(v_result.last) := RowType(i * v_test, 'Blub'); 
    END LOOP; 
    RETURN v_result; 
END; 

create or replace 
FUNCTION Func_B 
RETURN TableType AS 
v_result TableType := TableType(); 
BEGIN 
    FOR i IN 1..5 LOOP 
    SELECT cast(multiset (select * FROM TABLE(Func_A(i))) as TableType) 
    INTO v_result 
    FROM DUAL; 
    END LOOP; 
    RETURN v_result; 
END; 

SELECT * FROM TABLE(Func_B()) 

Это должно быть наиболее эффективным способом:

v_result := Func_A(i) MULTISET UNION ALL v_result; 

ответ

0

В каждой итерации цикла перезаписи v_result с последними результатами набора из Func_A. Вместо этого используйте union, чтобы добавить результат итерации к результатам предыдущих итераций.

FOR i IN 1..5 LOOP 
    SELECT cast(multiset (select * FROM TABLE(Func_A(i))) as TableType) 
     multiset union all v_result 
    INTO v_result 
    FROM DUAL; 
END LOOP; 
+0

Это прекрасно работает. Является ли это наиболее эффективным методом или существуют другие возможности, связанные с объединением табличных переменных? – user2798190

+0

@ пользователь2798190 AFAIK да - есть. Я вижу, что вы нашли простой синтаксис самостоятельно. См. Также [Назначение результатов операции установки для вложенных переменных таблицы] (http://docs.oracle.com/cd/E11882_01/appdev.112/e17126/composites.htm#CIHIHEHG) из документации Oracle. – user272735

Смежные вопросы