Interaksi PL/SQL dengan Oracle
6.7. Menggunakan Cursor Expressions
Sebuah cursor expression menghasilkan nested cursor. Setiap baris data di dalam result set dapat berisi nilai-nilai seperti biasanya, ditambah dengan cursors yang dihasilkan oleh subqueries yang menimbulkan nilai-nilai lain di dalam baris data tersebut. Sehingga, query tunggal dapat menghasilkan kumpulan besar dari nilai-nilai yang terkait yang ditampilkan dari beberapa tabel. Kita dapat memproses result set dengan nested loops yang mengambil nilai (fetch) dari baris-baris data dari result set, kemudian beberapa nested cursors bersama dengan baris-baris data tersebut.
PL/SQL mendukung queries dengan ekspresi-ekspresi cursor sebagai bagian dari deklarasi-deklarasi cursor, eklarasi-deklarasi REF CURSOR dan variable-variable ref cursor. Kita juga dapat menggunakan ekspresi-ekspresi cursor di dalam query-query SQL dinamis. Berikut ini adalah sintaksnya:
CURSOR ( subquery )
Nested cursor secara implisit dibuka ketika baris data yang terkandung di-fetch dari cursor induk. Nested cursor ditutup hanya jika:
- Nested cursor secara eksplisit ditutup oleh user
- Cursor induk dieksekusi ulang
- Cursor induk ditutup
- Cursor induk dibatalkan
- Kesalahan timbul selama proses fetch pada salah satu dari cursor-cursor induknya. Nested cursor ditutup sebagai bagian dari pembersihan.
6.7.1. Batasan-batasan Cursor Expressions
- Kita tidak dapat menggunakan ekspresi-ekspresi cursor bersama dengan implicit cursor.
- Ekspresi-ekspresi cursor dapat muncul hanya:
- Dalam perintah SELECT yang tidak bersarang di dalam ekspresi query yang lain, kecuali ia adalah subquery dari ekspresi cursor itu sendiri.
- Sebagai argumen-argumen untuk function-function table, di dalam klausa FROM dari perintah SELECT.
- Ekspresi-ekspresi cursor dapat muncul hanya di dalam daftar SELECT terluar dari spesifikasi query
- Ekspresi-ekspresi cursor tidak dapat muncul dalam deklarasi-deklarasi view.
- Kita tidak dapat melakukan operasi-operasi BIND dan EXECUTE pada ekspresi-ekspresi cursor.
6.7.2. Contoh Cursor Expressions
Dalam contoh ini, kita menemukan ID lokasi yang telah ditentukan, dan cursor dari mana kita dapat mengambil seluruh departemen dari lokasi tersebut. Bersamaan dengan kita mengambil setiap nama departemen, kita juga mendapatkan cursor lain yang mengijinkan kita untuk mengambil detil karyawan yang terkait dari table lainnya.
CREATE OR REPLACE procedure emp_report(p_locid number) is
TYPE refcursor is ref cursor;
-- Query hanya menghasilkan 2 kolom, namun kolom kedua adalah
-- sebuah cursor yang mengijinkan kita melintasi kumpulan informasi yang berhubungan.
CURSOR c1 is
SELECT l.city, CURSOR(SELECT d.department_name, CURSOR(SELECT e.last_name
FROM employees e
WHERE e.department_id = d.department_id) as ename
FROM departments d where l.location_id = d.location_id) dname
FROM locations l
WHERE l.location_id = p_locid;
loccur refcursor;
deptcur refcursor;
empcur refcursor;
V_city locations.city%type;
V_dname departments.department_name%type;
V_ename employees.last_name%type;
BEGIN
OPEN c1;
LOOP
FETCH C1 INTO v_city, loccur;
EXIT WHEN c1%notfound;
-- Kita dapat mengakses kolom C1.city, lalu memproses hasil-hasil dari cursor bersarang.
LOOP
FETCH loccur INTO v_dname, deptcur; -- No need to open
EXIT WHEN loccur%notfound;
LOOP
FETCH deptcur into v_ename; -- tidak perlu dibuka
EXIT WHEN deptcur%notfound;
DBMS_OUTPUT.PUT_LINE(v_city ||' '||v_dname||' '||v_ename);
END LOOP;
END LOOP;
END LOOP;
close c1;
END;
/
| 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 […]