Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

SELECT Data FROM CURSOR of PACKAGE, imprima-o


Você definiu uma função em pipeline e esta não é a maneira de chamá-la:
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> 

Você precisa usar uma função TABLE(). Embora então você descobrirá o bug em seu código:
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> 

Observe que eu tive que matar essa sessão de outra sessão, caso contrário, ela ainda estaria em execução. Então vamos simplificar a função e nos livrar desse segundo loop inútil....
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;
/

.... então ei!
SQL> select * from table(Cursor_pkg_func.f_trans(5))
  2  /

VAR_CHAR2
------------------------------
ADAMS
JAMES
MILLER
SMITH

SQL> 

Você criou uma função em pipeline. Porque você fez isso? A razão pela qual você deveria ter feito isso era porque você queria uma função PL/SQL que pudesse ser usada na cláusula FROM de uma instrução SELECT. Esse é o caso de uso para funções em pipeline. Portanto, colocar a chamada em um bloco PL/SQL anônimo realmente não faz sentido.

Mas mesmo assim.

Por favor, leia a documentação. É bastante abrangente, é online e gratuito. A seção pertinente na Referência PL/SQL é o capítulo sobre SQL estático. Deixa claro que as instruções SELECT em PL/SQL devem sempre buscar registros em uma variável de alguma descrição. Os blocos PL/SQL anônimos são exatamente os mesmos que os procedimentos armazenados a esse respeito. Saiba mais .