sql >> Databáze >  >> RDS >> Oracle

VYBERTE Data Z KURZORU PACKAGE, vytiskněte je

Definovali jste zřetězenou funkci a toto není způsob, jak ji volat:

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> 

Musíte použít funkci TABLE(). I když pak objevíte chybu ve svém kódu:

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> 

Všimněte si, že jsem musel tuto relaci ukončit z jiné relace, jinak by stále běžela. Pojďme tedy funkci zjednodušit a zbavit se té nesmyslné druhé smyčky ....

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

.... pak hle!

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

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

SQL> 

Vytvořili jste zřetězenou funkci. Proč jsi to udělal? Důvod, proč jste to měli udělat, byl ten, že jste chtěli funkci PL/SQL, kterou lze použít v klauzuli FROM příkazu SELECT. To je případ použití pro zřetězené funkce. Takže vkládat volání do anonymního bloku PL/SQL opravdu nedává smysl.

Ale stejně.

Přečtěte si prosím dokumentaci. Je poměrně obsáhlý, je online a zdarma. Příslušnou částí v PL/SQL Reference je kapitola o statickém SQL. Je jasné, že příkazy SELECT v PL/SQL musí vždy načíst záznamy do proměnné nějakého popisu. Anonymní bloky PL/SQL jsou v tomto ohledu stejné jako uložené procedury. Další informace .




  1. Jak zajistíte, aby přední fulltextové vyhledávání se zástupnými znaky fungovalo na serveru SQL Server?

  2. Jak nastavím sql úplné datum a čas pomocí jazyka Java, a nejen datum?

  3. Znovu použijte poddotaz z Select Expression v WHERE-Clause

  4. ODP.NET / EF6 - datový typ CHAR v klauzuli WHERE