PL/SQL Subprograms

8.15.5. Menulis Sebuah Pipelined Table Function

Kita mendeklarasikan sebuah pipelined table function dengan menentukan keyword PIPELINED. Keyword ini mengindikasikan bahwa function tersebut akan menghasilkan baris data secara iteratif (berulang). Tipe hasil dari pipelined table function tersebut harus berupa sebuah collection type, seperti sebuah nested table atau sebuah varray. Kita dapat mendeklarasikan collection ini pada schema level, atau di dalam sebuah package. Dalam function tersebut, kita mengembalikan elemen-elemen tunggal dari collection type tersebut.

Sebagai contoh, berikut ini adalah seklarasi-deklarasi untuk dua pipelined table functions. (Tubuh dari function ditunjukka pada akhir dari contoh-contoh berikut.)

CREATE FUNCTION GetBooks(cat CLOB) RETURN BookSet_t
PIPELINED IS ...;
CREATE FUNCTION StockPivot(p refcur_pkg.refcur_t) RETURN TickerTypeSet
PIPELINED IS...;

8.15.6. Mengembalikan Hasil-hasil dari Table Functions

Dalam PL/SQL, perintah PIPE ROW menyebabkan sebuah table function mem-pipe sebuah baris data dan melanjutkan pemrosesan. Perintah tersebut memungkinkan PL/SQL table function mengembalikan baris-baris data sebera setelah mereka dihasilkan. (Untuk performa, PL/SL runtime system menyediakan baris-baris data kepada consumer dalam bentuk batch). Sebagai contoh:

CREATE FUNCTION StockPivot(p refcur_pkg.refcur_t) RETURN TickerTypeSet
PIPELINED IS
out_rec TickerType := TickerType(NULL,NULL,NULL);
in_rec p%ROWTYPE;
BEGIN
  LOOP
    FETCH p INTO in_rec;
    EXIT WHEN p%NOTFOUND;
    -- baris pertama
    out_rec.ticker := in_rec.Ticker;
    out_rec.PriceType := 'O';
    out_rec.price := in_rec.OpenPrice;
    PIPE ROW(out_rec);
    -- baris kedua
    out_rec.PriceType := 'C';
    out_rec.Price := in_rec.ClosePrice;
    PIPE ROW(out_rec);
  END LOOP;
  CLOSE p;
  RETURN;
END;
/

Dalam contoh tersebut, perintah PIPE ROW (out_rec) melakukan pipeline data keluar dari PL/SQL table function. Out_rec adalah sebuah record, tipenya sesuai dengan tipe dari sebuah elemen dari output collection tersebut.

Perintah PIPE ROW dapat digunakan hanya di dalam tubuh dari pipelined table functions; sebuah error muncul jika ia digunakan pada posisi selain daripada itu. Perintah PIPE ROW dapat diabaikan untuk sebiah pipelined table function yang tidak menghasilkan baris data sama sekali.

Sebuah pipelined table function harus memiliki sebuah perintah RETURN yang tidak mengembalikan sebuah nilai. Perintah RETURN tersebut mentransfer control kembali ke consumer dan memastikan bahwa fetch berikutnya mendapatkan sebuah exception NO_DATA_FOUND.

Oracle memiliki tiga tipe data SQL khusus yang memungkinkan kita secara dinamis mengenkapsulasi dan mengakses deskripsi-deskripsi tipe, data instances, dan kumpulan dari data instances dari SQL type yang lain, termasuk object dan collection types. Kita dapat juga menggunakan tiga tipe khusus ini untuk menciptakan tipe anonymous (tak bernama), termasuk anonymous collection types. Tipe-tipe tersebut adalah
SYS.ANYTYPE, SYS.ANYDATA, dan SYS.ANYDATASET. Tipe SYS.ANYDATA dapat berguna dalam beberapa situasi sebagai sebuah nilai kembali dari table functions.

8.15.7. Pipelining Data Antara PL/SQL Table Functions

Dengan serial execution, hasil-hasil di-pipeline dari satu PL/SQL table function ke lainnya dengan menggunakan sebuah pendekatan yang mirip dengan co-routine execution. Sebagai contoh, perintah berikut ini mem-pipeline hasil-hasil dari function g ke function f:

SELECT * FROM TABLE(f(CURSOR(SELECT * FROM TABLE(g()))));

Parallel execution bekerja mirip kecuali bahwa setiap function dieksekusi dalam sebuah proses yang berbeda (atau kumpulan dari proses-proses).

8.15.8. Melakukan Query terhadap Table Functions

Pipelined table functions digunakan dalam klausa FROM dari perintah SELECT. Baris-baris data hasil ditampilkan oleh Oracle secara iteratif dari implementasi table function tersebut. Sebagai contoh:

SELECT x.Ticker, x.Price
FROM TABLE(StockPivot(CURSOR(SELECT * FROM StockTable))) x
WHERE x.PriceType='C';

Catatan: Sebuah table function mengembalikan sebuah collection. Dalam beberapa kasus, seperti halnya ketika top-level query menggunakan SELECT * dan query tersebut mengacu kepada sebuah PL/SQL variable atau sebuah bind variable, kita mungkin memerlukan operator CAST disekitar table function tersebut untuk menentukan tipe hasil sesungguhnya.

 

 

Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26


Bookmark and Share

 

Buku ini membahas berbagai macam tip dan trik yang sangat berguna bagi Anda pembaca pengguna database Oracle. Pemula, mahasiswa, programmer, maupun database administrator yang mengharapkan solusi cepat dalam menangani permasalahan-permasalahan dalam penggunaan database Oracle dapat membaca buku ini. Anda tidak harus membaca buku ini secara urut karena buku ini di susun berdasarkan topik permasalahan, dan Anda dapat membaca topik-topik yang sesuai dengan permasalahan yang Anda hadapi.
Dapat di beli di toko buku Gramedia, Gunung Agung, Uranus, Karisma, Uranus dsb.

 

Find Related articles