Oracle
 sql >> Base de données >  >> RDS >> Oracle

SELECT Data FROM CURSOR of PACKAGE, imprimez-le

Vous avez défini une fonction en pipeline, et ce n'est pas la façon de l'appeler :

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> 

Vous devez utiliser une fonction TABLE(). Bien qu'alors vous découvrirez le bogue dans votre code :

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> 

Notez que j'ai dû tuer cette session à partir d'une autre session, sinon elle serait toujours en cours d'exécution. Alors simplifions la fonction et débarrassons-nous de cette deuxième boucle 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;
/

.... alors voilà !

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

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

SQL> 

Vous avez créé une fonction en pipeline. Pourquoi fais-tu ça? La raison pour laquelle vous auriez dû le faire était que vous vouliez une fonction PL/SQL pouvant être utilisée dans la clause FROM d'une instruction SELECT. C'est le cas d'utilisation des fonctions en pipeline. Donc, mettre l'appel dans un bloc PL/SQL anonyme n'a vraiment aucun sens.

Mais de toute façon.

Veuillez lire la documentation. Il est assez complet, il est en ligne et gratuit. La section pertinente dans la référence PL/SQL est le chapitre sur le SQL statique. Il est clair que les instructions SELECT en PL/SQL doivent toujours récupérer des enregistrements dans une variable d'une certaine description. Les blocs PL/SQL anonymes sont identiques aux procédures stockées à cet égard. En savoir plus .