![](/img/trans.png)
[英]How to change PL/SQL function call when function is no longer pipelined?
[英]PL/SQL Passing a local collection into a pipelined function
我需要將本地定義的表類型傳遞給函數,該函數是返回另一個本地定義的表類型的流水線函數。
這是示例數據:
create table my_tab
(i NUMBER,
n VARCHAR2(30));
insert into my_tab values (1, 'Peter');
insert into my_tab values (2, 'Dakshesh');
insert into my_tab values (1, 'Maggie');
insert into my_tab values (3, 'Madhu');
commit;
我的代碼是:
CREATE OR REPLACE PACKAGE my_pkg IS
TYPE t_col IS RECORD(
i NUMBER,
n VARCHAR2(30));
TYPE t_nested_table IS TABLE OF t_col;
TYPE t_number IS TABLE OF NUMBER;
FUNCTION iterate_table RETURN t_number PIPELINED;
FUNCTION return_table(in_t_num t_number) RETURN t_nested_table PIPELINED;
g_number t_number ;
g_nested_number t_nested_table ;
END my_pkg;
/
身體:
CREATE OR REPLACE PACKAGE BODY my_pkg IS
FUNCTION iterate_table RETURN t_number PIPELINED IS
BEGIN
IF ( (g_number IS NOT NULL) AND (g_number.EXISTS (1)))
THEN
FOR i IN 1 .. g_number.COUNT
LOOP
IF g_number (i) IS NOT NULL
THEN
PIPE ROW (g_number (i));
END IF;
END LOOP;
END IF;
RETURN;
EXCEPTION
WHEN OTHERS
THEN
RAISE;
END iterate_table;
FUNCTION return_table(in_t_num t_number) RETURN t_nested_table PIPELINED IS
l_row t_nested_table ;
CURSOR cur_test IS
select mt.i, mt.n
from my_tab mt, TABLE(iterate_table ) tab
where mt.i = tab.column_value;
BEGIN
OPEN cur_test;
FETCH cur_test BULK COLLECT into l_row;
CLOSE cur_test;
FOR i IN 1..l_row.COUNT
LOOP
PIPE ROW(l_row(i));
END LOOP;
RETURN;
END return_table;
END my_pkg;
/
現在這段代碼編譯成功,當我嘗試像流水線函數一樣調用它時,它給出了錯誤-
select * from table(my_pkg.return_table(my_pkg.t_number(1)));
錯誤- ORA-00902: invalid datatype 00902. 00000 - "invalid datatype" *Cause:
*Action: Error at Line: 14 Column: 41ORA-00902: invalid datatype 00902. 00000 - "invalid datatype" *Cause:
*Action: Error at Line: 14 Column: 41
此代碼的兩個先決條件是 -
集合應該都是本地定義的。
該函數應該是流水線的。
幫助!!
我沒有收到任何表及其單個表的錯誤,因此沒有外鍵約束。
在oracle 11中是不可能的。我不知道oracle為什么會拋出“無效數據類型”。 如果將此查詢放入匿名塊,您將收到PLS-00642: Local Collection Types Not Allowed in SQL Statement
如果您不想或無法創建 sql 級別的集合。 解決方案是使用預定義類型。 預定義集合的良好來源是Oracle Data Cartridge
。 用t_number
替換所有ODCINumberList
。
在 Oracle 10 和 11 中,無法在 SQL 范圍內使用已在 PL/SQL 范圍中定義的集合。 在 Oracle 12 中,您正在嘗試的應該有效。
如果您想這樣做,請在 SQL 范圍內(不在包中)聲明您的類型。
CREATE OR REPLACE TYPE t_col IS OBJECT(
i NUMBER,
n VARCHAR2(30)
);
/
CREATE OR REPLACE TYPE t_nested_table IS TABLE OF t_col;
/
CREATE OR REPLACE TYPE t_number IS TABLE OF NUMBER;
/
CREATE OR REPLACE PACKAGE my_pkg IS
FUNCTION iterate_table RETURN t_number PIPELINED;
FUNCTION return_table(in_t_num t_number) RETURN t_nested_table PIPELINED;
g_number t_number ;
g_nested_number t_nested_table ;
END my_pkg;
/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.