Sabtu, 07 Januari 2012

Resume PBD 2 Pert 6 & 7


Menulis Kursor Explisit

Tentang Cursors

Setiap pernyataan SQL dieksekusi oleh Server Oracle memiliki kursor individu yang terkait dengan itu:
Implicit cursors: Dinyatakan untuk semua DML dan PL / SQL SELECT
Explicit cursors: Dinyatakan dan dinamai oleh programmer

Mengontrol
Explicit Cursors
1. Buka
Cursor
2. Ambil baris
3. Tutup
Cursor

Decklaring the Cursor

Syntax:

CURSOR cursor_name IS
select_statement;

• Jangan menyertakan klausa INTO dalam deklarasi kursor.
• Jika pengolahan baris dalam urutan tertentu diperlukan, gunakan ORDER BY klausa dalam query.
.

Example:

DECLARE
CURSOR emp_cursor IS
SELECT employee_id, last_name
FROM employees;
CURSOR dept_cursor IS
SELECT *
FROM departments
WHERE location_id = 170;
BEGIN
...

Membuka Cursor

Syntax:
OPEN cursor_name;

• Buka kursor untuk mengeksekusi query dan mengidentifikasi set aktif.
• Jika query tidak mengembalikan baris, tidak terkecuali dinaikkan.
• Gunakan atribut kursor untuk menguji hasil setelah pengambilan
.

Mengambil Data dari Cursor

Syntax:

FETCH cursor_name INTO [variable1, variable2, ...]
| record_name];

• Ambil nilai-nilai baris saat ini ke dalam variabel.
• Sertakan jumlah yang sama
dari variabel.
• Mencocokkan setiap variabel untuk sesuai dengan posisi
kolom.
• Test untuk melihat apakah kursor mengandung baris
.

Example:
LOOP
FETCH emp_cursor INTO v_empno,v_ename;
EXIT WHEN ...;
...
-- Process the retrieved data
END LOOP;

Penutupan  Cursor

Syntax:

CLOSE cursor_name;

• Tutup kursor setelah menyelesaikan processing of the rows.
• Membuka kembali kursor, jika diperlukan.
• Jangan mencoba untuk mengambil data dari kursor setelah itu telah ditutup.
.

Explicit Cursor Attributes

Mendapatkan informasi status tentang cursor

Attribute
Type
Description
%ISOPEN
Boolean
Mengevaluasi TRUE jika kursor terbuka
%NOTFOUND
Boolean
Mengevaluasi TRUE jika fetch terbaru tidak mengembalikan baris
%FOUND
Boolean
Mengevaluasi TRUE jika fetch terbaru mengembalikan baris; pelengkap %NOTFOUND
%ROWCOUNT
Number
Mengevaluasi untuk jumlah baris yang dikembalikan terakhir kali

The %ISOPEN Attribute

• Ambil baris hanya ketika kursor terbuka.
• Gunakan atribut
% ISOPEN kursor sebelum melakukan fetch untuk menguji apakah kursor terbuka.

Example:

IF NOT emp_cursor%ISOPEN THEN
OPEN emp_cursor;
END IF;
LOOP
FETCH emp_cursor...

Controlling Multiple Fetches

• Proses beberapa baris dari kursor eksplisit menggunakan loop.
• Ambil baris dengan setiap iterasi.
• Gunakan atribut kursor eksplisit untuk menguji keberhasilan setiap
fetch.

The %NOTFOUND and %ROWCOUNT Attributes

Use the %ROWCOUNT cursor attribute untuk mengambil jumlah baris yang tepat.
Use the %NOTFOUND cursor attribute untuk menentukan kapan untuk keluar dari loop.

Example

DECLARE
v_empno employees.employee_id%TYPE;
v_ename employees.last_name%TYPE;
CURSOR emp_cursor IS
SELECT employee_id, last_name
FROM employees;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_empno, v_ename;
EXIT WHEN emp_cursor%ROWCOUNT > 10 OR
emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE (TO_CHAR(v_empno)
||' '|| v_ename);
END LOOP;
CLOSE emp_cursor;
END ;
Cursor anf Records

Proses baris dari set aktif dengan mengambil nilai-nilai ke dalam PL/SQL RECORD.

DECLARE
CURSOR emp_cursor IS
SELECT employee_id, last_name
FROM employees;
emp_record emp_cursor%ROWTYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp_record;
...

Cursor For Loops

Syntax:

FOR record_name IN cursor_name LOOP
statement1;
statement2;
. . .
END LOOP;

• Kursor FOR loop adalah cara pintas untuk memproses kursor eksplisit.
Implisit terbuka, mengambil, keluar, dan menutup .
• Re
cord ini secara implisit dideklarasikan..

Mencetak daftar karyawan yang bekerja untuk departemen penjualan.

DECLARE
CURSOR emp_cursor IS
SELECT last_name, department_id
FROM employees;
BEGIN
FOR emp_record IN emp_cursor LOOP
IF emp_record.department_id = 80 THEN
...
END LOOP;
END;
/

Cursor FOR Loops Using Subqueries

Tidak perlu untuk menyatakan kursor.
Example:

BEGIN
FOR emp_record IN (SELECT last_name, department_id
FROM employees) LOOP
-- implicit open and implicit fetch occur
IF emp_record.department_id = 80 THEN
...
END LOOP; -- implicit close occurs
END;

Tidak ada komentar:

Posting Komentar