パイプライン関数を定義しましたが、これはそれを呼び出す方法ではありません:
SQL> begin
2 Cursor_pkg_func.f_trans(5);
3 end;
4 /
Cursor_pkg_func.f_trans(5);
*
ERROR at line 2:
ORA-06550: line 2, column 1:
PLS-00221: 'F_TRANS' is not a procedure or is undefined
ORA-06550: line 2, column 1:
PL/SQL: Statement ignored
SQL>
TABLE()関数を使用する必要があります。ただし、コードのバグが見つかります:
SQL> select * from table(Cursor_pkg_func.f_trans(5))
2 /
SMITH
SMITH
SMITH
''''
SMITH
SMITH
SMITH
SMITH
ERROR:
ORA-00028: your session has been killed
273660 rows selected.
SQL>
別のセッションからそのセッションを強制終了する必要があることに注意してください。そうしないと、引き続き実行されます。それでは、関数を単純化して、その無意味な2番目のループを取り除きましょう....
CREATE OR REPLACE PACKAGE BODY Cursor_pkg_func IS
FUNCTION f_trans (p in number) RETURN outrecset PIPELINED IS
out_rec outrec_typ;
BEGIN
OPEN Cursor_pkg.C1;
LOOP
FETCH Cursor_pkg.C1 INTO Cursor_pkg.row_emp;
EXIT when Cursor_pkg.C1%NOTFOUND;
out_rec.var_char2 := Cursor_pkg.row_emp.last_name;
PIPE ROW(out_rec);
END LOOP;
CLOSE Cursor_pkg.C1;
RETURN;
END f_trans;
END Cursor_pkg_func;
/
....それならlo!
SQL> select * from table(Cursor_pkg_func.f_trans(5))
2 /
VAR_CHAR2
------------------------------
ADAMS
JAMES
MILLER
SMITH
SQL>
パイプライン関数を作成しました。どうしてそんなことをしました?これを行う必要がある理由は、SELECT文のFROM句で使用できるPL/SQL関数が必要だったためです。これは、パイプライン化された関数のユースケースです。したがって、呼び出しを匿名のPL/SQLブロックに入れることは実際には意味がありません。
とにかく。
ドキュメントをお読みください。それは非常に包括的で、オンラインで無料です。 PL / SQLリファレンスの関連セクションは、静的SQLの章です。 PL/SQLのSELECT文は常に必要があることは明らかです。 ある記述の変数にレコードをフェッチします。匿名PL/SQLブロックは、この点でストアドプロシージャとまったく同じです。 詳細a> 。