C U R S O R
MENGAPA HARUS ADA CURSOR ? PL/SQL TIDAK MENGIJINKAN MENAMPILKAN BEBERAPA BARIS MENGGUNAKAN PERINTAH SELECT
APAKAH CURSOR ITU ? SEJENIS VARIABEL YANG DIGUNAKAN UNTUK MENAMPUNG BANYAK NILAI BERUPA BARIS ATAU RECORD
PEMBAGIAN CURSOR EKSPLISIT : CURSOR YANG DIBUKA DAN DITUTUP SECARA MANUAL ATRIBUT : %FOUND (BARIS DITEMUKAN) %NOTFOUND (BARIS TIDAK DITEMUKAN) %ROWCOUNT (JUMLAH BARIS YANG DIAMBIL OLEH FECTH) %ISOPEN (BERNILAI TRUE KALAU CURCOR MASIH TERBUKA)
CURSOR EKSPLISIT DECLARE NAMA_VARIABEL TIPE DATA; CURSOR NAMA_CURSOR IS SELECT........................................ ; OPEN NAMA_CURSOR; FETCH NAMA_CURSOR INTO NAM_VARIABEL; CLOSE NAMA_CURSOR;
CONTOH CURSOR EKSPLISIT (DEKLARASI) set serveroutput on declare vgaji gaji%rowtype; cursor gaji is select last_name, salary, department_id from employees where department_id=50 order by last_name;
CONTOH CURSOR EKSPLISIT (BODY) begin open gaji; loop fetch gaji into vgaji; exit when gaji%notfound; dbms_output.put_line(vgaji.last_name ||‘ '||vgaji.salary||' '||vgaji.department_id); end loop; close gaji; end; /
PEMBAGIAN CURSOR IMPLISIT : CURSOR YANG TIDAK PERLU DIDEKLARASIKAN DAN BERGABUNG DENGAN PERINTAH INSERT, DELETE DAN UPDATE ATRIBUT : SQL%FOUND (BERNILAI TRUE BILA TIDAK DITEMUKAN) %NOTFOUND (KEBALIKANNYA) %ROWCOUNT (MENUNJUKAN BANYAK BARIS YANG DIBERIKAN OLEH QUERY PADA USER) %ISOPEN (BERNILAI TRUE PADA SAAT EKSEKUSI)
CONTOH CURSOR IMPLISIT (1) set serveroutput on DECLARE baris number(5); BEGIN UPDATE employees SET salary = salary + 1000; IF SQL%NOTFOUND THEN dbms_output.put_line('Tidak ada Gaji berbasil di update');
CONTOH CURSOR IMPLISIT (2) ELSIF SQL%FOUND THEN baris := SQL%ROWCOUNT; dbms_output.put_line('Gaji ' || baris ||’ Sudah di update'); END IF; end; /
HANDLING EXCEPTIONS
PEMBAGIAN HANDLING EXCEPTIONS PREDEFINED EXCEPTION : kondisi exception yang sudah didefinisikan dalam oracle USER DEFINED EXCEPTION : penanganan error yang didefinisikan oleh programmer
CONTOH PREDEFINED EXCEPTION set serveroutput on DECLARE nama VARCHAR2(15); BEGIN SELECT last_name INTO nama FROM employees WHERE first_name='John’; dbms_output.put_line(‘John is last name is : ‘||nama); End;/
CONTOH PREDEFINED EXCEPTION set serveroutput on DECLARE nama VARCHAR2(15); BEGIN SELECT last_name INTO nama FROM employees WHERE first_name='John'; dbms_output.put_line('John is last name is : '||nama);
CONTOH PREDEFINED EXCEPTION WHEN TOO_MANY_ROWS THEN dbms_output.put_line('Pernyataan SELECT yang menampilkan banyak baris harus menggunakan cursor'); end; /
CONTOH PREDEFINED EXCEPTION (1) set serveroutput on DECLARE vempid employees.employee_id%TYPE:=199; vnama employees.last_name%TYPE;
CONTOH PREDEFINED EXCEPTION (2) BEGIN SELECT last_name INTO vnama FROM employees WHERE employee_id=vempid; dbms_output.put_line('Namanya : '||vnama);
CONTOH PREDEFINED EXCEPTION (2) WHEN NO_DATA_FOUND THEN dbms_output.put_line('Data Tidak Ada'); end; /
CONTOH USER DEFINED EXCEPTION (1) set serveroutput on DECLARE vempid employees.employee_id%TYPE; vnama employees.last_name%TYPE; vsal employees.salary%TYPE; pesan exception;
CONTOH USER DEFINED EXCEPTION (2) BEGIN SELECT last_name,salary INTO vnama,vsal FROM employees WHERE employee_id=182; dbms_output.put_line(vnama||' '||vsal); if vsal < 3000 then raise pesan; end if;
CONTOH USER DEFINED EXCEPTION (3) WHEN pesan then dbms_output.put_line('Gaji dibawah $3000'); end; /
PROCEDURE DAN FUNCTION
PROCEDURE CREATE OR REPLACE PROCEDURE TAMPIL IS VSAL EMPLOYEES.SALARY%TYPE; BEGIN SELECT SALARY INTO VSAL FROM EMPLOYEES WHERE EMPLOYEE_ID=199; DBMS_OUTPUT.PUT_LINE(VSAL); END; /
PROCEDURE EXEC TAMPIL; BEGIN TAMPIL; END; /
MENJALANKAN PROCEDURE CREATE OR REPLACE PROCEDURE INPUT_TAMPIL(VEMPID NUMBER) IS VNAMA EMPLOYEES.LAST_NAME%TYPE; VSAL EMPLOYEES.SALARY%TYPE; BEGIN SELECT LAST_NAME,SALARY INTO vNAMA,vSAL FROM EMPLOYEES WHERE EMPLOYEE_ID=VEMPID; DBMS_OUTPUT.PUT_LINE('NAMANYA : '||VNAMA||' GAJINYA : '||VSAL); END; /