Oracle
 sql >> Datenbank >  >> RDS >> Oracle

SELECT Data FROM CURSOR of PACKAGE, drucken Sie es aus

Sie haben eine Pipeline-Funktion definiert, und das ist nicht die Art, sie aufzurufen:

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> 

Sie müssen eine TABLE()-Funktion verwenden. Obwohl Sie dann den Fehler in Ihrem Code entdecken werden:

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> 

Beachten Sie, dass ich diese Sitzung von einer anderen Sitzung beenden musste, sonst würde sie noch laufen. Vereinfachen wir also die Funktion und beseitigen diese sinnlose zweite Schleife ....

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

.... dann siehe da!

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

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

SQL> 

Sie haben eine Pipeline-Funktion erstellt. Warum hast du das getan? Der Grund, warum Sie das hätten tun sollen, war, weil Sie eine PL/SQL-Funktion wollten, die in der FROM-Klausel einer SELECT-Anweisung verwendet werden konnte. Das ist der Anwendungsfall für Pipeline-Funktionen. Es macht also wirklich keinen Sinn, den Aufruf in einen anonymen PL/SQL-Block zu stecken.

Aber trotzdem.

Bitte lesen Sie die Dokumentation. Es ist ziemlich umfassend, es ist online und kostenlos. Der relevante Abschnitt in der PL/SQL-Referenz ist das Kapitel zu Static SQL. Es macht deutlich, dass SELECT-Anweisungen in PL/SQL immer müssen Abrufen von Datensätzen in eine Variable mit einer bestimmten Beschreibung. Anonyme PL/SQL-Blöcke sind in dieser Hinsicht genauso wie gespeicherte Prozeduren. Weitere Informationen .