PLSQL - 合并表变量

时间:2013-09-20 07:45:29

标签: database plsql multiset

我有一个函数Func_A,它返回一个表变量。现在我想创建一个其他函数Func_B,它多次调用Func_A并返回Func_A组合的所有结果。但只返回Func_A的最后结果。如何将函数a的所有结果合并在一起?

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;

1 个答案:

答案 0 :(得分: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;