Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

PILIH Data DARI KURSOR PAKET, cetak

Anda telah mendefinisikan fungsi pipelined, dan ini bukan cara untuk memanggilnya:

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> 

Anda perlu menggunakan fungsi TABLE(). Meskipun kemudian Anda akan menemukan bug dalam kode Anda:

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> 

Catatan saya harus mematikan sesi itu dari sesi lain, jika tidak maka akan tetap berjalan. Jadi mari kita sederhanakan fungsinya dan singkirkan loop kedua yang tidak berguna itu ....

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

.... lalu lo!

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

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

SQL> 

Anda telah membuat fungsi pipelined. Kenapa kau melakukan itu? Alasan Anda seharusnya melakukannya adalah karena Anda menginginkan fungsi PL/SQL yang dapat digunakan dalam klausa FROM dari pernyataan SELECT. Itu adalah kasus penggunaan untuk fungsi pipelined. Jadi menempatkan panggilan ke blok PL/SQL anonim benar-benar tidak masuk akal.

Tapi bagaimanapun juga.

Silakan baca dokumentasi. Ini cukup komprehensif, online dan gratis. Bagian terkait dalam Referensi PL/SQL adalah bab tentang SQL Statis. Jelas bahwa pernyataan SELECT dalam PL/SQL harus selalu mengambil catatan ke dalam variabel dari beberapa deskripsi. Blok PL/SQL anonim sama dengan prosedur tersimpan dalam hal ini. Cari tahu lebih lanjut .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Petunjuk langkah demi langkah untuk Instalasi Oracle Virtual Box

  2. Mengembalikan kursor dari prosedur dalam ke prosedur luar di Oracle pl/sql

  3. Kurangnya Oracle terhadap tipe data Bit untuk kolom tabel

  4. ORA-29278:Kesalahan transien SMTP:Layanan tidak tersedia saat menjalankan UTL_MAIL

  5. Nama Oracle TNS tidak muncul saat menambahkan koneksi baru ke SQL Developer