Interaksi PL/SQL dengan Oracle
6.5. Menggunakan Cursor Variables
Seperti halnya cursor, cursor variable menunjuk kepada baris terkini di dalam result set dari query multi-baris. Namun, cursor berbeda dengan cursor variable seperti halnya konstanta berbeda dengan variable. Jika cursor bersifat statis, cursor variable bersifat dinamis karena ia tidak terikat terhadap query tertentu. Kita dapat membuka cursor variable untuk beberapa query dengan tipe yang kompatibel.
Kita juga dapat memberikan nilai-nilai baru kepada cursor variable dan melewatkannya sebagai parameter kepada subprogram-subprogram lokal atau yang stored. Hal ini memberikan kemudahan kepada kita untuk memusatkan proses penampilan data.
Cursor variable tersedia pada setiap PL/SQL client. Sebagai contoh, kita dapat mendeklarasikan cursor variable di dalam lingkungan PL/SQL host seperti program OCI atau Pro*C, lalu melewatkannya sebagai input host variable (bind variable) ke PL/SQL. Lebih jauh lagi, application development tools seperti Oracle Forms dan Oracle Reports, yang memiliki PL/SQL engine, dapat juga menggunakan cursor variable secara keseluruhan pada sisi client.
Oracle server juga memiliki PL/SQL engine. Kita juga dapat melewatkan cursor variable kembali dan seterusnya diantara aplikasi dan server melalui remote procedure calls (RPCs).
6.5.1. Apa itu Cursor Variables?
Sebagian besar, kita menggunakan cursor variables untuk melewatkan result sets dari suatu query diantara PL/SQL stored subprograms dan bermacam-macam clients. Tidak satupun PL/SQL maupun clients-nya memiliki result set; mereka secara sederhana berbagi penunjuk (pointer) terhadap area kerja query dimaan result set disimpan. Sebagai contoh, OCI client, aplikasi Oracle Forms, dan Oracle server dapat mengacu kepada area kerja yang sama.
Area kerja query tetap dapat diakses sejauh terdapat cursor variable yang menunjuk kepadanya. Dengan demikian, kita dapat melewatkan nilai dari cursor variable secara bebas dari satu jangkauan (scope) ke jangkauan lainnya. Sebagai contoh, jika kita melewatkan host cursor variable ke blok PL/SQL yang tertanam di dalam program Pro*C, area kerja yang ditunjuk oleh cursor variable tetap dapat diakses setelah blokĀ PL/SQL tersebut selesai diproses.
Jika kita memiliki PL/SQL engine pada sisi client, pemanggilan dari client ke server tidak menentukan batasan-batasan. Sebagai contoh, kita dapat mendeklarasikan cursor variable pada sisi client, membuka dan mengambil nilai darinya pada sisi server, kemudian melanjutkan mengambil nilai darinya kembali pada sisi client. Kita dapat juga mengurangi network traffic dengan memiliki blok PL/SQL yang membuka (atau menutup) beberapa host cursor variables dalam single round trip.
6.5.3. Mendefinisikan Tipe-tipe REF CURSOR
Dalam menciptakan cursor variables, kita melakukan dua langkah. Pertama, kita mendefinisikan tipe REF CURSOR, kemudian mendeklarasikan variable-variable dengan tipe tersebut. Kita dapat mendefinisikan tipe-tipe REF CURSOR pada suatu blok PL/SQL, subprogram, atau package dengan menggunakan sintaks
TYPE ref_type_name IS REF CURSOR [RETURN return_type];
dimana ref_type merupakan penentu tipe yang digunakan dalam deklarasi-deklarasi berikutnya dari cursor variables dan return_type harus merepresentasikan record atau baris data (row) di dalam database table. Dalam contoh berikut ini, kita menentukan tipe hasil (return type) yang merepresentasikan baris data dalam database table dept:
DECLARE TYPE DeptCurTyp IS REF CURSOR RETURN dept%ROWTYPE;
Tipe-tipe REF CURSOR dapat bersifat strong (restrictive) atau weak (nonrestrictive). Seperti ditunjukkan oleh contoh berikutnya, definisi tipe REF CURSOR strong menentukan tipe hasil, namun definisi weak tidak:
DECLARE TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE; -- strong TYPE GenericCurTyp IS REF CURSOR; -- weak
Tipe REF CURSOR strong lebih sedikit menyebabkan error karena PL/SQL compiler mengijinkan kita untuk menghubungkan tipe cursor variable tersebut dengan hanya query-query bertipe kompatibel. Namun, tipe-tipe REF CURSOR weak lebih fleksibel karena compiler mengijinkan kita menghubungkan tipe cursor variable ini query apapun.
6.5.4. Mendeklarasikan Cursor Variables
Sekali kita mendefinisikan tipe REF CURSOR, kita dapat mendeklarasikan cursor variables dengan tipe itu di dalam suatu blok PL/SQL atau subprogram. Dalam contoh berikut ini, kita mendeklarasikan cursor variable dept_cv:
DECLARE TYPE DeptCurTyp IS REF CURSOR RETURN dept%ROWTYPE; dept_cv DeptCurTyp; -- mendeklarasikan cursor variable
Catatan: Kita tidak dapat mendeklarasikan cursor variable di dalam package. Tidak seperti packaged variables, cursor variables tidak memiliki keadaan yang tetap. Perlu kita ingat, mendeklarasikan cursor variable menciptakan pointer, bukannya item. Jadi, cursor variable tidak dapat disimpan di dalam database.
Cursor variables mengikuti jangkauan dan aturan instantiation biasanya. PL/SQL cursor variables lokal dimulai ketika kita memasuki blok atau subprogram dan dihentikan ketika kita keluar.
Dalam klausa RETURN dari definisi tipe REF CURSOR, kita dapat menggunakan %ROWTYPE untuk menentukan tipe record yang merepresentasikan baris data yang dihasilkan oleh tipe cursor variable strong (bukan weak), sebagai berikut:
DECLARE TYPE TmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE; tmp_cv TmpCurTyp; -- mendeklarasikan cursor variable TYPE EmpCurTyp IS REF CURSOR RETURN tmp_cv%ROWTYPE; emp_cv EmpCurTyp; -- mendeklarasikan cursor variable
Demikian juga, kita dapat menggunakan %TYPE untuk menyediakan tipe data dari variable record, seperti ditunjukkan oleh contoh berikut ini:
DECLARE dept_rec dept%ROWTYPE; -- mendeklarasikan record variable TYPE DeptCurTyp IS REF CURSOR RETURN dept_rec%TYPE; dept_cv DeptCurTyp; -- mendeklarasikan cursor variable
Pada contoh terakhir, kita menentukan tipe user-defined RECORD dalam klausa RETURN:
DECLARE
TYPE EmpRecTyp IS RECORD (
empno NUMBER(4),
ename VARCHAR2(1O),
sal NUMBER(7,2));
TYPE EmpCurTyp IS REF CURSOR RETURN EmpRecTyp;
emp_cv EmpCurTyp; -- mendeklarasikan cursor variable
6.5.4.1. Cursor Variables Sebagai Parameters
Kita dapat mendeklarasikan cursor variables sebagai parameter-parameter formal dari function-function dan procedure-procedure. Dalam contoh berikut ini, kita mendefinisikan tipe REF CURSOR EmpCurTyp, kemudian mendeklarasikan variable dengan tipe tersebut sebagai formal parameter dari procedure:
DECLARE TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE; PROCEDURE open_emp_cv (emp_cv IN OUT EmpCurTyp) IS ...
Perhatian: Seperti halnya seluruh pointers, cursor variables meningkatkan kemungkinan pengaliasan parameter.
| 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 dsb. Harga Rp. 24.800,- (157 halaman) |


[…] Interaksi PL/SQL dengan Oracle - 6,172 viewsFungsi Baris Tunggal - 4,245 viewsData Modelling dan Database Design - 3,954 viewsMengubah Table dan Constraint - 3,213 viewsTipe-tipe Data PL/SQL - 3,145 viewsPL/SQL Subprograms - 2,742 viewsMengontrol Akses User - 2,717 viewsCollections dan Records PL/SQL - 2,654 viewsMenampilkan Data - 2,572 viewsPendahuluan - 2,555 views […]