Kamis, 11 November 2010

Kursor Implisit & Eksplisit

PL / SQL kursor untuk program tersebut menyediakan beberapa baris pilih dari data database, dan kemudian secara terpisah untuk setiap baris metode pengolahan data, ia menyediakan arah untuk pengolahan SQL Oracle dan mengendalikan semua tahapan metode. Saya akan berpikir bahwa Anda miliki di PL / SQL memiliki beberapa pemahaman.
Perbedaan antara implisit dan eksplisit:

A.Kursor implisit adalah salah satu diciptakan "secara otomatis" untuk Anda oleh Oracle ketika Anda mengeksekusi query. Hal ini mudah untuk kode, tetapi menderita .

B.Kursor eksplisit adalah salah satu yang Anda buat sendiri. Dibutuhkan lebih kode, tetapi memberikan kontrol yang lebih besar - misalnya, Anda bisa membuka-menjemput-dekat jika Anda hanya ingin rekaman pertama dan tidak peduli jika ada orang lain.

--->Penciptaan kursor
Kursor penanganan
Mendefinisikan dan menggunakan atribut kursor
Pertama, apa yang kursor
Oracle menggunakan dua cursor: kursor kursor eksplisit dan implisit. Pernyataan untuk kembali tidak peduli berapa banyak catatan, PL / SQL untuk menggunakan setiap UPDATE, DELETE, dan INSERT perintah SQL seperti pernyataan implisit kursor. (SQL untuk mengelola pengolahan, itu harus implisit dengan definisi kursor a) Pengguna menampilkan laporan menangani kursor menggunakan perintah SELECT kembali beberapa catatan.Definisi tampilan kursor struktur yang memungkinkan pengguna untuk menentukan pernyataan yang spesifik daerah memori untuk digunakan nanti.

--->peran kursor
Ketika PL / SQL query kursor kembali beberapa baris data, catatan ini disebut set aktif. Oracle akan mengatur kegiatan Anda membuat layar disimpan dalam definisi kursor bernama. kursor Oracle adalah menangani mekanisme mudah untuk data multi-line, tidak ada kursor, pengembang Oracle harus, secara individu, untuk secara eksplisit mengatur kursor kembali dan memeriksa setiap record yang dipilih.
Fungsi lain dari hal kursor, itu berisi catatan pointer akses saat ini, pembuatan program Anda dapat menangani lebih dari satu catatan.

--->metode dasar menggunakan kursor layar
Langkah-langkah adalah sebagai berikut:

Deklarasi kursor
Buka kursor
Ambil data dari kursor
Tutup kursor
1, deklarasi kursor
Sintaks deklarasi kursor adalah sebagai berikut:
MENYATAKAN cursor_name
Adalah
Pernyataan SELECT

Yang, cursor_name Anda untuk menentukan nama kursor; SELECT adalah untuk mengatur kursor kembali untuk merekam kegiatan penyelidikan.
Kursor untuk menyelesaikan pernyataan berikut dua tujuan:
Untuk nama kursor;
Untuk mengasosiasikan sebuah query dengan kursor.
Perlu dicatat yang harus PL / SQL blok pernyataan bagian dari laporan kursor, untuk menentukan nama kursor adalah identifier diumumkan, bukan PL / SQL variabel ke nama kursor tidak dapat diberikan, juga tidak dapat digunakan dalam ekspresi. PL / SQL blok untuk menggunakan nama ini untuk referensi permintaan kursor.
Kasus: MENYATAKAN
Kursor c1
Adalah
PILIH DARI VIEW_NAME ALL_VIEWS
WHERE ROWNUM = 10;
Kursor juga dapat menentukan parameter dari pernyataan deklarasi kursor, contoh:
Kursor c1 (melihat nomor _nbr)
Adalah
PILIH DARI VIEW_NAME ALL_VIEWS
WHERE ROWNUM = tampilan _nbr;

parameter kursor hanya kursor yang bersangkutan akan terlihat, tidak dapat dirujuk di kursor di luar parameter kursor. Jika Anda mencoba untuk melakukannya, Oracle akan kembali kesalahan yang variabel tidak didefinisikan.
2, buka kursor
Buka sintaks kursor adalah sebagai berikut:
BUKA cursor_name;

Cursor_name yang adalah nama yang Anda sebelumnya didefinisikan kursor.
Buka kursor akan mengaktifkan permintaan dan mengidentifikasi set aktif, tapi sebelum order dalam implementasi kursor kembali dan tidak benar-benar mengambil catatan. BUKA perintah juga menginisialisasi pointer kursor ke titik ke set aktif rekaman pertama. Kursor dibuka sampai penutupan sebelum acara tersebut akan mengambil kembali semua data yang statis, dengan kata lain, mengabaikan semua kursor kursor terbuka setelah pelaksanaan data perintah SQL DML (INSERT, UPDATE, DELETE, dan SELECT) . Oleh karena itu, hanya buka bila diperlukan, untuk me-refresh set aktif, cukup menutup dan membuka kembali kursor dapat.
3, untuk mengambil data dari kursor
perintah FETCH untuk mengambil setiap kali catatan kegiatan cara terkonsentrasi di catatan. FETCH perintah dan biasanya digunakan bersama dengan semacam pengolahan berulang, proses berulang, perintah FETCH Setiap kali kursor maju ke acara berikutnya memecahkan rekor.
Sintaks perintah FETCH:
FETCH cursor_name INTO record_list;

Yang, cursor_name adalah nama dari kursor di depan definisi; record_list adalah daftar variabel aktivitas yang berfokus pada penerimaan kolom. Set perintah FETCH aktif untuk menempatkan hasil variabel-variabel ini.
pelaksanaan perintah FETCH, aktivitas yang berfokus pada hasil dibawa kembali ke PL / SQL variabel, sehingga PL / SQL blok digunakan. Setiap belakang rekor, pindahkan kursor pointer pada acara berikutnya memecahkan rekor.
Contoh:
FETCH C1 INTO VNAME;
SEMENTARA C1% FOUND LOOP
DBMS_OUTPUT.PUT_LINE (TO_CHAR (C1% ROWCOUNT )||''''| | VNAME);
END LOOP;
Di antara mereka, penggunaan properti''% FOUND''so ketika aktivitas ditetapkan untuk mencapai akhir FETCH tidak akan menaikkan pengecualian. atribut lainnya dan makna sebagai berikut:
Atribut konten
% DITEMUKAN Boolean properti, ketika kembali sukses terbaru dari catatan, maka nilai adalah TRUE
% NOTFOUND properti Boolean bahwa nilai dari total nilai dari properti dengan% DITEMUKAN berlawanan
% ISOPEN Boolean properti, ketika kursor terbuka, mengembalikan TRUE
% ROWCOUNT atribut numerik, kembali kursor untuk membaca dari jumlah record

Atribut tingkat
% DITEMUKAN Boolean atribut, ketika kembali sukses terbaru dari catatan, maka nilai adalah TRUE
% NOTFOUND properti Boolean bahwa nilai dari total nilai dari properti dengan% DITEMUKAN berlawanan
% ISOPEN Boolean properti, ketika kursor terbuka, mengembalikan TRUE
% ROWCOUNT atribut numerik, kembali kursor untuk membaca dari jumlah record

--->dekat kursor
pernyataan CLOSE untuk menutup sebelum terbuka kursor, membuat himpunan peristiwa yang tidak pasti. Ketika pengguna program atau akhir sesi, Oracle secara implisit dekat kursor. Kursor tertutup, tidak akan melakukan apa pun, kecuali dinyatakan dibuang.
CLOSE sintaks pernyataan adalah:
cursor_name CLOSE;
Yang, cursor_name adalah nama kursor sebelum terbuka.
kode lengkap adalah sebagai berikut:
MENYATAKAN
Kursor C1 VIEW_NAME IS SELECT DARI ALL_VIEWS
WHERE ROWNUM = 10
ORDER BY VIEW_NAME;
VNAME VARCHAR2 (40);
BEGIN
OPEN C1;
FETCH C1 INTO VNAME;
SEMENTARA C1% FOUND LOOP
DBMS_OUTPUT.PUT_LINE (TO_CHAR (VNAME )||''''|| C1% ROWCOUNT);
END LOOP;
END;
... ... CLOSE C1;



Contoh kursor implisit:

declare
nama_cari varchar(15);
nama_depan varchar(15);
nama_belakang varchar(15);
gaji varchar(10);
cursor anu is
select first_name, last_name, salary
from employees
where first_name = nama_cari;
begin
nama_cari := '&masukkan_nama';
open anu;
loop
fetch anu into nama_depan, nama_belakang, gaji;
exit when anu%notfound;
dbms_output.put_line('pegawai bernama '||nama_depan||' ' ||nama_belakang||' gajinya adalah USD '||gaji);
end loop;
close anu;
end;
/


Contoh kursor eksplisit:

declare
a employees.first_name%type;
b employees.salary%type;
c emplooyees.first_name%type;

begin
c:='&nama_cari';
select first_name,salary
into a,b
from employees
where first_name= c;
dbms_output.put_line('gajinya '||a||'adalah USD '||B);


exception

when no_data_found then
dbms_output.put_line('maaf nama'||c||'tidak d temukan');
when too_many_rows then
dbms_output.put_line('maaf nama'||c||'lebih dari 1orang');
end;
/

Selasa, 02 November 2010

LOOPING......

Pernyataan LOOP

Pernyataan LOOP berguna untuk melakukan pengulangan. Bentuknya:
[ awal_label : ] LOOP
Statement_list
END LOOP [ akhir_label ]
Daftar pernyataan yang berada antara LOOP dan END LOOP akan terus dieksekusi sampai ada suatu pernyataan untuk keluar pengulangan dieksekusi. Dalam hal ini, pernyataan yang digunakan untuk keluar pengulangan berupa pernyataan LEAVE.

contoh:
1.

Declare

i number(3);

BEGIN

FOR i IN 1..10 LOOP

DBMS_OUTPUT.PUT_LINE('Ini angka ' || i );

END LOOP;

END;

/


2.

DECLARE

total NUMBER(9);

counter NUMBER(6);

BEGIN

total := 0;

counter := 10;

LOOP

total := total + counter;

EXIT WHEN total > 50;

END LOOP;

DBMS_OUTPUT.PUT_LINE('Counter: ' || counter);

DBMS_OUTPUT.PUT_LINE(' Total: ' || total);

END;



Pada prosedur tes_loop, variable pecahan dideklarasikan sebagai variable local yang bertipe INT. Mula-mula variable tersebut diiisi dengan 0. Selanjutnya, pernyataan
SELECT CONCAT ( ‘Nilai awal pecahan : ‘, pecahan ) ;
Digunakan untuk menampilkan tulisan ‘Nilai awal pecahan : ‘diikuti dengan isi variable pecahan.
Pernyataan LOOP digunakan untuk mengeksekusi pernyataan-pernyataan yang ada didalamnya secara terus-menerus, sampai ada perintah untuk keluar dari pernyetaan tersebut.
Pernyataan yang ada dalam LOOP yang pertama adalah
SET pecahan = pecahan + 1 ;
Pernyataan tersebut untuk menaikkan isi variable pecahan sebesar 1.

Kondisional PL/SQL (IF -THEN -ELSE)

Pembahasan kali ini menunjukkan kepada kita bagaimana menyusun aliran kontrol melalui program PL/SQL. Kita akan mempelajari bagaimana perintah-perintah dihubungkan dengan struktur-struktur kontrol sederhana namun powerful, yang memiliki single entry dan exit point. Secara bersama-sama, struktur-struktur ini dapat menangani berbagai situasi. Penggunaan yang tepat akan menghasilkan program terstruktur yang baik.


A. Gambaran Struktur Kontrol PL/SQL

Berdasarkan structure theorem, setiap program komputer dapat ditulis menggunakan struktur kontrol dasar yang ditunjukkan dalam Gambar 4-1. Mereka dapat dikombinasikan dalam suatu cara yang diperlukan untuk menjawab permasalahan-permasalahan yang ada.

Gambar 4-1 Struktur-struktur Kontrol

Struktur seleksi menguji kondisi, lalu mengeksekusi satu rangkaian perintah-perintah daripada lainnya, bergantung kepada kondisi mana yang true atau false. Suatu condition (kondisi) merupakan suatu variable atau ekpresi yang menghasilkan nilai Boolean (TRUE atau FALSE). Struktur perulangan mengeksekusi rangkaian perintah-perintah secara berulang-ulang selama suatu kondisi bernilai true. Struktur sekuensial (berurutan) secara sederhana mengeksekusi rangkaian perintah-perintah dalam urutan.

B. Struktur Kondisional: Perintah-perintah IF dan CASE

Seringkali, diperlukan untuk mengambil tindakan-tindakan alternatif bergantung kepada keadaan-keadaan yang ada. Perintah IF mengijinkan kita untuk mengeksekusi rangkaian perintah-perintah berdasarkan suatu kondisi. Dengan begitu, apakah suatu rangkaian perintah-perintah dieksekusi atau tidak, bergantung kepada nilai dari kondisi. Terdapat tiga bentuk perintah-perintah IF: IF-THEN, IF-THEN-ELSE, dan IF-THEN-ELSIF. Perintah CASE merupakan cara yang ringkas untuk mengevaluasi kondisi tunggal dan memiliki diantara banyak alternatif tindakan.

1. Perintah IF-THEN

Bentuk sederhana dari perintah IF menghubungkan kondisi dengan rangkaian perintah-perintah yang diapit oleh kata-kata kunci THEN dan END IF (bukan ENDIF), seperti berikut:

IF condition THEN
sequence_of_statements
END IF;

Rangkaian perintah-perintah dieksekusi hanya jika kondisi adalah true. Jika kondisi bernilai false atau null, perintah IF tidak melakukan apa-apa. Dalam salah satu kasus, kontrol berlalu kepada perintah selanjutnya. Contohnya:

IF sales > quota THEN
compute_bonus(empid);
UPDATE payroll SET pay = pay + bonus WHERE empno = emp_id;
END IF;

Kita dapat meletakkan perintah-perintah IF yang pendek dalam satu baris tunggal, seperti

IF x > y THEN high := x; END IF;

2. Perintah IF-THEN-ELSE

Bentuk kedua dari perintah IF menambahkan kata kunci ELSE diikuti oleh rangkaian perintah-perintah alternatif, seperti berikut:

IF condition THEN
sequence_of_statements1
ELSE
sequence_of_statements2
END IF;

Rangkaian perintah-perintah dalam klausa ELSE dieksekusi hanya jika kondisi bernilai false atau null. Jadi, klausa ELSE memastikan bahwa rangkaian perintah-perintah tersebut dieksekusi. Dalam contoh berikut ini, perintah UPDATE pertama dieksekusi ketika kondisi bernilai true, namun perintah UPDATE kedua dieksekusi ketika kondisi bernilai false atau null:

IF trans_type = 'CR' THEN
UPDATE accounts SET balance = balance + credit WHERE ...
ELSE
UPDATE accounts SET balance = balance - debit WHERE ...
END IF;


Klausa-klausa THEN dan ELSE dapat mengandung perintah-perintah IF. Sehingga, perintah-perintah IF dapat bersarang, seperti ditunjukkan oleh contoh berikut ini:

IF trans_type = 'CR' THEN
UPDATE accounts SET balance = balance + credit WHERE ...
ELSE
IF new_balance >= minimum_balance THEN
UPDATE accounts SET balance = balance - debit WHERE ...
ELSE
RAISE insufficient_funds;
END IF;
END IF;


contoh:

declare

x varchar(10);

y number(5);

begin

x:= ‘tes';

Y:= 15;

dbms_output.put_line('Selamat Datang '||x);

if y <>

dbms_output.put_line(‘tes lagi ah’);

end if;

end;

/



3. Perintah IF-THEN-ELSIF

Suatu ketika kita ingin memilih suatu tindakan dari beberapa alternatif yang terpisah satu sama lain. Bentuk ketiga dari perintah IF menggunakan kata kunci ELSIF (bukan ELSEIF) untuk memperkenalkan kondisi-kondisi tambahan, sebagai berikut:

IF condition1 THEN
sequence_of_statements1
ELSIF condition2 THEN
sequence_of_statements2
ELSE
sequence_of_statements3
END IF;

Jika kondisi pertama bernilai false atau null, klausa ELSIF akan menguji kondisi lainnya. Perintah IF dapat memiliki sejumlah klausa ELSIF; klausa final ELSE bersifat opsional (bisa digunakan atau tidak). Kondisi-kondisi dievaluasi satu demi satu dari atas ke bawah. Jika suatu kondisi bernilai true, rangkaian perintah-perintah yang ada di dalamnya dieksekusi dan kontrol akan menuju ke perintah selanjutnya. Jika seluruh kondisi bernilai false atau null, maka rangkaian perintah-perintah di dalam klausa ELSE yang akan dieksekusi. Mari kita perhatikan contoh berikut ini:

BEGIN
...
IF sales > 50000 THEN
bonus := 1500;
ELSIF sales > 35000 THEN
bonus := 500;
ELSE
bonus := 100;
END IF;
INSERT INTO payroll VALUES (emp_id, bonus, ...);
END;

Jika nilai sales lebih besar dari 50000, kondisi pertama dan kedua bernilai true. Namun, bonus diberikan kepada nilai yang sesuai dari 1500 karena kondisi kedua tidak pernah diuji. Ketika kondisi pertama bernilai true, perintah-perintah di dalamnya dieksekusi dan kontrol menuju ke perintah INSERT.

4.2.5. Pedoman untuk Perintah-perintah Kondisional PL/SQL

Hindari perintah-perintah IF yang janggal seperti contoh berikut ini:

IF new_balance < overdrawn =" TRUE">Kode ini mengabaikan fakta-fakta yang berguna. Pertama, nilai ekspresi Boolean dapat langsung diberikan kepada variable Boolean. Jadi, kita dapat mengganti perintah IF pertama dengan pemberian nilai sederhana berikut ini:

overdrawn := new_balance <>Kedua, variable Boolean itu sendiri bernilai true atau false. Jadi, kita dapat menyederhanakan kondisi dalam perintah IF yang kedua menjadi:

IF overdrawn THEN ...

Jika dimungkinkan, gunakan klausa ELSIF daripada perintah-perintah IF bersarang. Dengan demikian, kode program kit menjadi lebih mudah dibaca dan dimengerti. Bandingkan perintah-perintah IF berikut ini:

IF condition1 THEN | IF condition1 THEN statement1; | statement1; ELSE | ELSIF condition2 THEN IF condition2 THEN | statement2; statement2; | ELSIF condition3 THEN ELSE | statement3; IF condition3 THEN | END IF; statement3; | END IF; | END IF; | END IF; |

Perintah-perintah ini secara logikal sama, namun perintah pertama tidak jelas dalam hal aliran logikanya, dimana perintah kedua mengungkapnya.

Jika kita membandingkan ekspresi tunggal terhadap banyak nilai, kita dapat menyederhanakan logika dengan menggunakan perintah CASE tunggal daripada menggunakan IF dengan banyak klausa ELSIF.