Selasa, 18 November 2014

CURSOR in DATABASE

Blok PL/SQL tidak memungkinkan untuk menangani query dengan keluaran lebih dari satu baris(record) karena variabel penampungnya harus mempunyai sebuah nilai. Karena itu, diperlukan sebuah cursor untuk menampung semua kondisi dari keluaran sebuah query. Cursor merupakan suatu variabel yang digunakan untuk menampung  hasil query yang terdiri atas lebih dari satu row atau record. Cursor dapat diilustrasikan sebagai penampung sekaligus pointer atas hasil eksekusi query. Pada dasarnya perintah “SELECT ..” pada PL/SQL merupakan sebuah cursor. Terdapat dua macam cursor, yaitu: cursor implisit dan cursor eksplisit.

Cursor Implisit
Merupakan perintah SELECT statement dengan klausa INTO yang terdapat di dalam blok PL/SQL dan harus menghasilkan satu baris record. Jika hasil cursor implisit ini lebih dari satu baris atau tidak menghasilkan satu baris pun, maka Oracle akan mengeluarkan pesan kesalahan. Klausa into pada cursor implisit dipakai untuk menugaskan nilai hasil proses select ke dalam variabel-variabel yang dipilih.
Contoh :

declare
      mhs_rec mahasiswa%rowtype;
      nim_nya mahasiswa.nim%type;
begin
      nim_nya := '30108001';
      select nim, nama, alamat into mhs_rec
      from nahasiswa
      where nim = nim_nya;
      ...
end;

Jika nilai nim sama dengan 30108001 dipenuhi maka hasil proses select menghasilkan satu baris, sedangkan jika nilai nim_nya diganti dengan nilai lain dimana nilai tersebut tidak akan menghasilkan satu baris pun, maka Oracle akan mengeluarkan pesan kesalahan. Demikian pula jika klausa where pada cursor di atas dihilangkan sementara di dalam tabel proyek terdapat lebih dari satu baris, maka cursor tersebut tidak dapat menampung semua baris yang diterima. Hal ini akan menimbulkan error “exact fetch returns more than requested number of rows”.

Cursor Eksplisit

Tidak seperti cursor implisit, cursor eksplisit harus dideklarasikan terlebih dahulu sebelum digunakan. Terdapat empat tahapan penggunaan cursor eksplisit ini yaitu: declare, open, fetch dan terakhir adalah close.

Statement declare:
CURSOR nama_cursor IS query


Merupakan deklarasi nama cursor dan definisi struktur query yang akan dilakukan di dalamnya.

Contoh:
DECLARE
CURSOR CUR1 IS
SELECT nim, nama, alamat
FROM mahasiswa
.. .. ..



Statement open
OPEN nama_cursor;

Sebelum suatu cursor dapat digunakan, cursor harus dibuka terlebih dahulu.

Contoh:
OPEN CUR1;


Statement fetch
FETCH nama_cursor INTO <variable1,variable2,..>;



Fetch merupakan perintah untuk mengambil isi cursor, dimana isi dari cursor tersebut adalah hasil query yang telah dideklarasikan pada statement deklarasi cursor. Dan tiap-tiap field hasil query tersebut kemudian ditampung dalam variable-variable yang tipe datanya sesuai dengan tipe-tipe kolom query pada statemen deklarasi. Fetch ini dilakukan untuk tiap-tiap baris.

Contoh:
FETCH CUR1 INTO v_nim, v_nama, v_alamat;



Statement close
CLOSE nama_cursor;


Setelah pemrosesan query selesai, cursor harus ditutup dengan satatemen CLOSE ini. Berikut ini adalah atribut-atribut untuk mendapatkan status cursor. Setiap atribut dalam penggunaannya harus didahului dengan nama cursor.


Cursor  FOR LOOP

Ada sebuah cara untuk mengambil isi cursor secara otomatis, yaitu dengan struktur pengulangan FOR LOOP.
Disebut otomatis karena
·   tidak perlu proses pembukaan cursor ( OPEN )
·   memanipulasi proses pengambilan cursor ( FETCH )
·   tidak perlu penutupan cursor ( CLOSE )
·   variabel indeks yang digunakan dalam struktur pengulangan  FOR_LOOP tidak perlu dideklarasikan terlebih dahulu

Sintaks:
DECLARE
CURSOR nama_cursor IS ekspresi-query

BEGIN
      FOR nama_record IN nama_cursor LOOP
      -- nama_record tidak perlu dideklarasikan
...
END LOOP
END;



Contoh:
DECLARE
CURSOR cur1 IS select nama from mahasiswa;

BEGIN
      FOR rec IN cur1 LOOP
            dbms_output.put_line(rec.nama);
END LOOP
END;



Nama record yang didefinisikan sesudah for merupakan pendeklarasian yang hanya internal di dalam loop, dan ruang lingkupnya bersifat internal sampai loop berhenti. Sebenarnya di dalam loop for, cursor tidak harus dideklarasikan terlebih dahulu.


Source :
http://dianayun30207013.blogspot.com/2011/01/cursor.html

PL/SQL

Karena pada SQL tidak mendukung pemrograman secara prosedural, maka dikembangkanlah PL/SQL. PL merupakan kependekan dari Procedural Language.

Variabel dan Tipe Data
Deklarasi Variabel dan Tipe Data
Bagian deklarasi variabel di antara kata kunci DECLARE dan BEGIN. Penamaan variabel tidal bersifat case sensitive. Tipe data variabel dapat berupa salah satu tipe data databaseOracle atau tipe data built in PL/SQL.
Sintaks:
Identifier typedata [(presisi, skala)] [NOT NULL] [:=iekspresi];
Dimana ekspresi bisa merupakan literal, variabel yang lain atau sebuah ekspresi yang terdiri atas operator dan fungsi. Jika nilai inisial/awal tidak diberikan, maka suatu variabel akan diberikan nilai NULL untuk nilai inisialnya.
Contoh untuk data karakter:
alamat VARCHAR2(20);
kodepos CHAR(5) := ‘40257’;
Contoh untuk tipe data number:
gaji NUMBER(7,2);
jumlah NUMBER NOT NULL := 0;
Contoh untuk tipe data tanggal:
alamat VARCHAR2(20);
kodepos CHAR(5) := ‘40257’;
Tanda := dipakai untuk menugaskan (assign) nilai kepada suatu variabel. Nilai inisial/awal atau disebut juga nilai default adalah nilai yang diberikan pada saat awal variabel tersebut dideklarasikan.


Pendeklarasian Konstanta
Sintaks:
Identifier CONSTANT typedate[(presisi,skala)] := ekspresi;
Contoh:
pi CONSTANT NUMBER(9,2):=3.14;
Atribut Variabel
Jika menggunakan variabel yang menampung nilai dari suatu kolom dari suatu tabel, maka sebaiknya menggunakan atribut variabel. Hal ini untuk menghindari terjadinya kerepotan seperti: user harus melihat struktur tabel yang terkait terlebih dahulu untuk memberikan tipe data yang cocok. Selain itu jika terjadi tipe data kolom maka deklarasi variabel tersebut harus diubah juga.
Atribut variabel berfungsi untuk memberikan tipe data yang sama dengan tipe data suatu kolom dari suatu tabel. Atribut variabel juga dapat digunakan untuk tipe data record. Dengan demikian, atribut variabel ada dua. Untuk atribut kolom digunakan %TYPE, sedangkan untuk atribut record gunakan %ROWTYPE. Cara penggunaannya ditunjukkan berikut ini:

[schema.]table.column%TYPE;

<cursor_name|[schema.]table>%ROWTYPE;

Sebagai contoh, varaiabel v_nama mempunyai tipe data yang sama dengan kolom nama pada tabel pegawai. Deklarasi variabel tersebut dapat dituliskan seperti ini:

v_nama mahasiswa.nama%type;

Selain dapat digunakan untuk variabel record, atribut %ROWTYPE bisa dipakai pada variabel cursor. Dan untuk mengakses baris-baris pada cursor atau record tersebut digunakan format nama_var.COLUMN.
Contoh:

pgw_rec pgw_cur%rowtype;

Menugaskan Nilai ke Dalam Variabel
Sintaks:

identifier := ekspresi;

Dimana identifier adalah nama variabel target, atau field untuk menerima nilai dari ekspresi. Sedang ekspresi mungkin berupa literal, nama variabel lain yang sudah ada, atau suatu ekspresi yang cukup kompleks yang diperlukan untuk menentukan suatu nilai yang akan ditugaskan.
Contoh:
v_jumlah := 0;


Pernyataan For - Loop
Struktur pengulangan For digunakan untuk menghasilkan pengulangan sejumlah kali tanpa penggunaan kondisi apapun. Stuktur ini menyebabkan aksi diulangi sejumlah beberapa kali (tertentu). Bentuk umum struktur for ada dua macam yaitu : menaik (ascending) atau menurun (descending). Sintaksnya sebagai berikut :
FOR counter IN [REVERSE] i_terendah .. i_teratas LOOP
      Baris perintah
END LOOP;
Perintah FOR-LOOP melakukan iterasi selama nilai COUNTER berada dalam range nilaii_terendah dan i_teratas. Pada FOR-LOOP, counter tidak perlu dideklarasikan. Penggunaan kata kunci RESERVE akan menyebabkan nilai counter dimulai dari i_teratas ke i_terendah. Dua titik antara i_terendah dan i_teratas merupakan operator rentang nilai. i_terendah maupun i_terkecil bisa berupa nilai integer ataupun variabel yang bernilai integer yang sudah dideklarasikan sebelumnya. i_upper harus lebih besar dari i_lower dan jika tidak maka iterasi tidak akan dilakukan.
Contoh:

BEGIN
FOR vno IN 1..10 LOOP
insert into coba(no) values vno;
dbms_output.put_line('Hasil looping ke- '||x);
END LOOP;
END;

BEGIN
FOR vno IN REVERSE 1..10 LOOP
insert into coba(no) values vno;
dbms_output.put_line('Hasil looping ke- '||x);
END LOOP;
END;







Ruang Lingkup Pernyataan FOR – LOOP
Contoh :

DECLARE
  ctr INTEGER; -- global variable
BEGIN
  ...
  FOR ctr IN 1..25 LOOP
...
IF ctr > 10 THEN ... -- refers to loop counter
END IF;
  END LOOP;
END;

Source :
http://dianayun30207013.blogspot.com/2011/01/pengenalan-plsql-dan-tipe-data.html

My Profile Banner

Waiting

Daisypath Happy Birthday tickers PitaPata Dog tickers Daisypath Christmas tickers