sql >> Database >  >> RDS >> Oracle

SELECTEER gegevens VIA CURSOR van PAKKET, druk het af

U hebt een gepijplijnde functie gedefinieerd en dit is niet de manier om deze aan te roepen:

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> 

U moet een TABLE()-functie gebruiken. Hoewel je dan de bug in je code zult ontdekken:

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> 

Merk op dat ik die sessie van een andere sessie moest beëindigen, anders zou hij nog steeds actief zijn. Dus laten we de functie vereenvoudigen en van die zinloze tweede lus afkomen ....

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

.... kijk dan!

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

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

SQL> 

U hebt een pijplijnfunctie gemaakt. Waarom deed je dat? De reden dat je dat had moeten doen, was omdat je een PL/SQL-functie wilde die in de FROM-clausule van een SELECT-instructie kon worden gebruikt. Dat is de use case voor gepijplijnde functies. Dus de aanroep in een anoniem PL/SQL-blok plaatsen heeft echt geen zin.

Maar goed.

Lees de documentatie. Het is vrij uitgebreid, het is online en gratis. De relevante sectie in de PL/SQL-referentie is het hoofdstuk over statische SQL. Het maakt duidelijk dat SELECT-statements in PL/SQL altijd . moeten records ophalen in een variabele met een bepaalde beschrijving. Anonieme PL/SQL-blokken zijn in dit opzicht precies hetzelfde als opgeslagen procedures. Meer informatie .




  1. Meerdere rijen in dezelfde tabel invoegen - Oracle 10g

  2. (Oracle SQL) Een unieke beperkingsfout opvangen

  3. PLS-00428:er wordt een INTO-clausule verwacht in deze SELECT-instructie

  4. heroku:relatie auth_group bestaat niet