Oracle
 sql >> Baza danych >  >> RDS >> Oracle

WYBIERZ dane Z KURSORA PAKIETU, wydrukuj

Zdefiniowałeś funkcję potokową i to nie jest sposób na jej wywołanie:

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> 

Musisz użyć funkcji TABLE(). Chociaż wtedy odkryjesz błąd w swoim kodzie:

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> 

Uwaga Musiałem zabić tę sesję z innej sesji, w przeciwnym razie nadal będzie działać. Uprośćmy więc funkcję i pozbądźmy się tej bezsensownej drugiej pętli...

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

....to lo!

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

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

SQL> 

Utworzyłeś funkcję potokową. Dlaczego to zrobiłeś? Powodem, dla którego powinieneś to zrobić, było to, że chciałeś funkcji PL/SQL, której można by użyć w klauzuli FROM instrukcji SELECT. To jest przypadek użycia funkcji potokowych. Tak więc umieszczenie wywołania w anonimowym bloku PL/SQL naprawdę nie ma sensu.

Ale i tak.

Prosimy o zapoznanie się z dokumentacją. Jest dość obszerny, jest dostępny online i bezpłatny. Stosowną częścią podręcznika PL/SQL Reference jest rozdział dotyczący statycznego języka SQL. Wyjaśnia, że ​​instrukcje SELECT w PL/SQL muszą zawsze pobrać rekordy do zmiennej o pewnym opisie. Anonimowe bloki PL/SQL są pod tym względem takie same jak procedury składowane. Dowiedz się więcej .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nie można przeanalizować znacznika czasu Oracle w C#

  2. Dynamiczny DESC i ASC Oracle w kolejności do

  3. różnica między tabelą tab a all_tables w Oracle

  4. Obsługa współbieżnego żądania podczas utrwalania w bazie danych Oracle?

  5. Jak wyodrębnić grupę z wyrażenia regularnego w Oracle?