Oracle
 sql >> Database >  >> RDS >> Oracle

SELEZIONA Dati DAL CURSORE di PACKAGE, stampalo

Hai definito una funzione pipeline e questo non è il modo di chiamarla:

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> 

Devi usare una funzione TABLE(). Anche se poi scoprirai il bug nel tuo codice:

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> 

Nota che dovevo uccidere quella sessione da un'altra sessione, altrimenti sarebbe ancora in esecuzione. Quindi semplifichiamo la funzione e sbarazziamoci di quel secondo ciclo inutile ....

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;
/

.... allora ecco!

SQL> select * from table(Cursor_pkg_func.f_trans(5))
  2  /

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

SQL> 

Hai creato una funzione pipeline. Perchè lo hai fatto? Il motivo per cui avresti dovuto farlo era perché volevi una funzione PL/SQL che potesse essere utilizzata nella clausola FROM di un'istruzione SELECT. Questo è il caso d'uso per le funzioni pipeline. Quindi inserire la chiamata in un blocco PL/SQL anonimo non ha davvero senso.

Ma comunque.

Si prega di leggere la documentazione. È abbastanza completo, è online e gratuito. La sezione pertinente nel Riferimento PL/SQL è il capitolo sull'SQL statico. Rende chiaro che le istruzioni SELECT in PL/SQL devono sempre recuperare i record in una variabile di qualche descrizione. I blocchi PL/SQL anonimi sono esattamente gli stessi delle stored procedure a questo proposito. Scopri di più .