ローカルに定義されたテーブルタイプを、別のローカルに定義されたテーブルタイプを返すパイプライン関数である関数に渡す必要があります。ここでPLSQLローカルコレクションをパイプライン関数に渡す
はサンプルデータです:
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: 41
このコードのための2つの前提条件である -
コレクションは、すべてのローカルに定義されなければなりません。
この関数はパイプライン化する必要があります。
ヘルプ!!
テーブルとその単一テーブルでエラーが発生しないため、外部キー制約が保持されません。
[OracleのORA-00902無効なデータ型エラー]の可能な重複に(http://stackoverflow.com/questions/24978942/oracle-ora-00902-invalid-datatype-error) –
いない...それはさ別の....私はテーブルを作成している間に任意のエラーを取得していないと単一のテーブルだけ..制約の違反。 –
もあります。匿名ブロックとdbms_outputユーティリティを使用して印刷すると、出力を取得できます。 –