Selasa, 10 November 2009

Cursor SQL

Blok PL/SQL tidak mengizinkan kita untuk menampilkan beberapa baris dengan menggunakan perintah SELECT secara langsung. Untuk mengatasi kendala ini, maka digunakanlah Cursor. Cursor merupakan sejenis variabel yang dapat digunakan untuk menampung banyak nilai berupa baris atau record. Nilai-nilai yang disimpan di dalam sebuah Cursor selanjutnya dapat dimanipulasi sehingga dapat digunakan sesuai kebutuhan. Atau dapat dikatakan bahwa Cursor merupakan pointer yang menunjuk ke suatu bagian memori untuk menyimpan hasil instruksi SQL. Hasil instruksi SQL tersebut biasanya merupakan multiple row, dan Cursor digunakan untuk menunjuk (pointer) ke salah satu baris data.

Dalam pemakaiannya, sebuah Cursor akan melalui beberapa tahap yakni :
1. Deklarasi (Declare)
2. Buka (Open)
3. Ambil Data (Fetch)
4. Tutup (Close).
Ada pula yang menyebutkan lima tahap, yakni :
1. Deklarasi (Declare)
2. Buka (Open)
3. Baca Berulang (Loop / Fetch)
4. Tutup (Close)
5. Dealokasi Memori (Deallocate)

Cusrsor sendiri dibedakan menjadi :
1. Cursor Eksplisit, merupakan Cursor yang harus dibuka dan ditutup secara manual.
2. Cursor Implisit, merupakan Cursor yang tidak perlu untuk dideklarasikan sebelumnya.

Contoh Sederhana Cursor Pada Oracle :
    DECLARE
    CURSOR CUR_BARANG IS
        SELECT KODE_BARANG, NAMA_BARANG, STOK_BARANG
        FROM BARANG;
    VREC CUR_BARANG%ROWTYPE;
    BEGIN
        OPEN CUR_BARANG;
        LOOP
            FETCH CUR_BARANG INTO VREC;
            EXIT WHEN CUR_BARANG%NOTFOUND;
            Dbms_Output.PUT_LINE(VREC.KODE_BARANG || ' ' || VREC.NAMA_BARANG || ' ' || VREC.STOK_BARANG);
        END LOOP;
        CLOSE CUR_BARANG;
    END;

Contoh Sederhana Cursor Pada SQL Server :
    CREATE PROCEDURE DAFTAR_PELANGGAN
    AS
    DECLARE @CUSTID INT
    DECLARE @CUSTNAME VARCHAR(30)
    DECLARE @DISCOUNT DECIMAL(4,2)
    DECLARE CUSTCURSOR CURSOR
    FOR
        SELECT CUSTID,CUSTNAME,DISCOUNT
        FROM CUSTOMER
        ORDER BY CUSTID
        FOR READ ONLY
            OPEN CUSTCURSOR
            WHILE (0=0) BEGIN
            FETCH NEXT
            FROM CUSTCURSOR INTO @CUSTID,@CUSTNAME,@DISCOUNT

            IF (@@FETCH_STATUS <> 0) BREAK
            PRINT CAST(@CUSTID AS VARCHAR(5)) + " " + @CUSTNAME + CAST(@DISCOUNT AS VARCHAR(5))
        END
    CLOSE CUSTCURSOR
    DEALLOCATE CUSTCURSOR

Cursor mendukung loop diantara result set, membaca setiap baris satu-persatu. Didalam Stored Procedure, Cursor merupakan teknik yang bermanfaat dalam implementasi perhitungan yang kompleks. Disamping itu, Cursor dapat digunakan untuk membantu membuat laporan / ringkasan.

Tidak ada komentar: