sql >> Databasteknik >  >> RDS >> Oracle

VÄLJ data FRÅN MARKören i PAKET, skriv ut den

Du har definierat en pipelined funktion, och detta är inte sättet att kalla den:

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> 

Du måste använda en TABLE()-funktion. Fast då kommer du att upptäcka felet i din kod:

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> 

Observera att jag var tvungen att döda den sessionen från en annan session, annars skulle den fortfarande köras. Så låt oss förenkla funktionen och bli av med den där meningslösa andra slingan ....

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

.... då se!

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

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

SQL> 

Du har skapat en pipelined funktion. Varför gjorde du det? Anledningen till att du borde ha gjort det var att du ville ha en PL/SQL-funktion som kunde användas i FROM-satsen i en SELECT-sats. Det är användningsfallet för funktioner i pipeline. Så att lägga in samtalet i ett anonymt PL/SQL-block är verkligen inte vettigt.

Men ändå.

Läs dokumentationen. Det är ganska omfattande, det är online och gratis. Det relevanta avsnittet i PL/SQL-referensen är kapitlet om Statisk SQL. Det klargör att SELECT-satser i PL/SQL måste alltid hämta poster till en variabel av någon beskrivning. Anonyma PL/SQL-block är precis samma sak som lagrade procedurer i detta avseende. Läs mer .




  1. Canonical:Hur man sparar HTML-formulärdata i MySQL-databas

  2. Oracle tar inte bort markörer efter stängning av resultatuppsättningen

  3. Python-parsning av en SQL med pyparsing

  4. Hur gör jag min kodiginter lösenordsåterställningsfunktion säker?