Вие сте дефинирали конвейерна функция и това не е начинът да я извикате:
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>
Имайте предвид, че трябваше да убия тази сесия от друга сесия, в противен случай тя все още щеше да работи. Така че нека опростим функцията и да се отървем от този безсмислен втори цикъл...
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;
/
... тогава ето!
SQL> select * from table(Cursor_pkg_func.f_trans(5))
2 /
VAR_CHAR2
------------------------------
ADAMS
JAMES
MILLER
SMITH
SQL>
Създадохте конвейерна функция. Защо го направи? Причината, поради която трябваше да направите това, беше, че искахте PL/SQL функция, която може да се използва в клаузата FROM на оператор SELECT. Това е случаят на използване на конвейерните функции. Така че поставянето на повикването в анонимен PL/SQL блок наистина няма смисъл.
Но както и да е.
Моля, прочетете документацията. Той е доста изчерпателен, онлайн е и е безплатен. Съответният раздел в справочника за PL/SQL е главата за статичен SQL. Изяснява се, че изразите SELECT в PL/SQL трябва винаги извлича записи в променлива с някакво описание. Анонимните PL/SQL блокове са същите като съхранените процедури в това отношение. Научете повече .