Minggu, 25 September 2011

Resume Pemrograman Basis Data 3


SQL Cursor ( Oracle )

Cursor digunakan dalam script PL/SQL untuk menampilkan data yang tersimpan di dalam database. Ada dua macam cursor yaitu implicit cursor (kursor implisit) dan explicit cursor(kursor eksplisit). Implicit cursor adalah cursor yang tidak perlu dideklarasikan pada bagian declaration, sedangkan explicit cursor harus dideklarasikan di bagian declaration.
Berikut ini adalah template untuk implicit cursor:
select [daftar kolom]
into [daftar variabel]
from [daftar tabel]
where [syarat]
contoh:
select first_name, last_name, salary
into nama_depan, nama_belakang, gaji
from employees
where first_name = ‘Susan’;
Berikut ini adalah contoh script PL/SQL yang menggunakan implicit cursor:
declare
nama_cari employees.first_name%type;
nama_depan employees.first_name%type;
alamat_email employees.email%type;
telepon employees.phone_number%type;
begin
nama_cari := '&masukkan_nama';
select first_name, email, phone_number
into nama_depan, alamat_email, telepon
from employees
where first_name = nama_cari;
dbms_output.put_line('Nama: '||nama_depan);
dbms_output.put_line('Email:'||alamat_email||'@SemogaJaya.co.id');
dbms_output.put_line('Telepon: '||telepon);
end;
/

sedangkan ini adalah template untuk explicit cursor:
declare
cursor [nama_cursor_bebas] is
   select [daftar_kolom]
   from [daftar_tabel]
   where [syarat];

begin
open [nama_cursor_bebas];
loop
   fetch [nama_cursor_bebas] into [daftar_variabel];
   exit when [nama_cursor_bebas] %notfound;
   [aksi_lain]
end loop;
close [nama_cursor_bebas];
end;
/
Explicit cursor harus melalui empat tahap yaitu declare, open, fetch dan close. Berikut ini adalah penjelasannya:
  1. Pada tahap declarecursor dideklarasikan pada blok PL/SQL. Cursor perlu dideklarasikan karena sifat cursor yang menyerupai variable (dapat dipanggil dalam blok utama program) namun deklarasi untuk cursor diletakkan setelah deklarasivariable lain, tepat sebelum awal program (begin)
  2. Pada tahap opencursor dibuka (query dalam cursor dieksekusi dan hasilnya ditampung dalam memory)
  3. Pada tahap fetch, satu baris data dalam cursor diambil dan ditransfer ke variablepenampung yang ada pada klausa into. Karena jumlah baris data kemungkinan lebih dari satu maka biasanya fetch diletakkan dalam looping yang akan berhenti begitu semua baris data dalam cursor selesai di-fetch ke variable penampung
  4. Pada tahap closecursor ditutup dan hasil query dalam cursor dihapus darimemory
Berikut ini adalah contoh script PL/SQL yang menggunakan explicit cursor:
declare
nama_cari employees.first_name%type;
nama_depan employees.first_name%type;
alamat_email employees.email%type;
telepon employees.phone_number%type;
cursor anu is
   select first_name, email, phone_number
   from employees
   where first_name = nama_cari;

begin
nama_cari := '&masukkan_nama';
open anu;
loop
   fetch anu into nama_depan, alamat_email, telepon;
   exit when anu%notfound;
   dbms_output.put_line('Nama: '||nama_depan);
   dbms_output.put_line('Email: '||alamat_email||'@SemogaJaya.co.id');
   dbms_output.put_line('Telepon: '||telepon);
   dbms_output.put_line(‘-----------------------------------------------------------’);
end loop;
close anu;
end;
/
SQL Function

Function adalah sebuah blok PL/SQL yang dapat mengembalikan nilai. Maka dari itu dalam pembuatannya harus menggunakan statemen RETURN untuk proses pengembalian nilai.
Syntax untuk membuat function :
CREATE OR REPLACE FUNCTION nama_function
(parameter_1 tipedata, parameter_2 tipedata, …) IS
RETURN tipedata_function IS
variabel-variabel_lokal
BEGIN
Statemen;
……
RETURN nilai_function;
END;
Contoh :
CREATE OR REPLACE PROCEDURE LAP_DEPARTMEN AS
BEGIN
  for deptid in (SELECT d.department_id, department_name,count(employee_id)
jml
  FROM departments d, employees e
       WHERE d.department_id = e.department_id(+)
       GROUP BY d.department_id, department_name)
  loop
dbms_output.put_line(deptid.department_id||‘Kode dari departemen‘ || deptid.department_name||‘ dengan
jumlah karyawan = ‘ || deptid.jml);
  for emp in (select employee_id, last_name from employees where department_id=deptid.department_id)
loop
dbms_output.put_line(‘  ‘||emp.employee.id||‘||emp.last_name);
       end; loop;
 end loop;
END LAP_DEPARTMEN;

Tidak ada komentar:

Posting Komentar