Anda di halaman 1dari 58

Pemrograman

SQL
Pada bab ini akan membahas
beberapa bagian dari SQL :

– Bahasa pemrograman SQL (SQL/PSM);


– Kursor SQL;
– Prosedur yang tersimpan;
– Trigger;
– Query rekursif.
Bahasa Pemrograman SQL

➢ SQL adalah bahasa deklaratif yang menangani baris data, sedangkan bahasa
tingkat tinggi seperti C adalah bahasa prosedural yang dapat menangani hanya satu
baris data pada suatu waktu.

➢ Ekstensi dikenal sebagai SQL / PSM (Persistent Stored Modules); Namun, untuk
membuat diskusi lebih konkret, kita mendasarkan presentasi terutama pada bahasa
pemrograman Oracle, PL / SQL.
Bahasa Pemrograman SQL
➢ PL / SQL (Prosedural Language / SQL) adalah ekstensi prosedural Oracle
untuk SQL. Ada dua versi dari PL / SQL: satu adalah bagian dari server
Oracle, dan yang lainnya adalah mesin yang terpisah tertanam dalam
sejumlah alat Oracle.
➢ Mereka sangat mirip satu sama lain dan memiliki konstruksi yang sama
pemrograman, sintaks, dan mekanisme logika, meskipun PL / SQL alat bantu
Oracle memiliki beberapa ekstensi untuk memenuhi persyaratan dari alat
tertentu (misalnya, PL / SQL memiliki ekstensi untuk Formulir Oracle ).
Blok PL / SQL memiliki hingga tiga bagian:

• Bagian Deklarasi (opsional), di mana


variabel, konstanta, kursor, records
pengecualian didefinisikan dan
mungkin diinisialisasi;

• Pelaksanaan Pernyataan (Wajib),


Bagian yang dieksekusi wajib, di mana
variabel yang dimanipulasi;

• Penanganan Pengecualian (opsional),


untuk menangani pengecualian muncul
selama eksekusi.
Deklarasi
Terdapat suatu deklarasi sebagai berikut :
vStaffNo VARCHAR2(5);
vRent NUMBER(6, 2) NOT NULL := 600;
MAX_PROPERTIES CONSTANT NUMBER :=100;

Misalnya, untuk menyatakan bahwa variabel vStaffNo adalah tipe yang sama
seperti kolom staffNo dari tabel Staf, kita bisa menulis:
vStaffNo Staff.staffNo%TYPE;
vStaffNo1 vStaffNo%TYPE;
Deklarasi
Contoh tersebut mendeklarasikan variabel dari jenis yang sama sebagai
kolom dalam tabel yang ditentukan atau variabel lain menggunakan
atribut% TYPE.
Misalnya, untuk mendeklarasikan variabel vStaffRec menjadi baris dari
tabel Staff :
vStaffRec Staf% ROWTYPE;
Contoh diatas merupakan mendeklarasikan variabel untuk menjadi
jenis yang sama seperti seluruh baris tabel atau melihat menggunakan
atribut% ROWTYPE.
Penugasan
Dibagian executable dari PL/SQL, variable dapat ditetapkan
dengan dua cara :
o Menggunakan pernyataan penugasan normal (:=)
o Sebagai hasil dari pernyataan SQL SELECT atau FETCH.
Sebagai contoh :
vStaffNo := ‘SG14’;
vRent := 500;
SELECT COUNT(*) INTO x FROM PropertyForRent WHERE staffNo =
vStaffNo;
Penugasan
Dalam kasus ketiga, variable x diatur ke hasil pernyataan
SELECT (dalam hal ini, sma dengan jumlah property yang
dikelola oleh anggota staf SG14).
Perhatikan bahwa dalam standar SQL, tugas menggunakan
kata kunci SET pada awal baris dengan symbol “=“. Bukan “:=“.
Sebagai contoh :
SET vStaffNo 5 ‘SG14’
Pernyataan Kontrol
✓ Pernyataan IF Bersyarat

Seperti contoh :
IF (position = ‘Manager’) THEN
salary := salary*1.05;
ELSE
salary := salary*1.03;
END IF;
Pernyataan Kontrol
✓ Pernyataan Kasus Bersyarat
Pernyataan Kontrol
✓ Pernyataan Iterasi (LOOP) Seperti contoh :
x:=1;
myLoop:
LOOP
x := x + 1;
IF (x > 3) THEN
EXIT myLoop; --- exit loop immediately
END LOOP myLoop;
--- control resumes here
y := 2;
Pernyataan Kontrol
✓ Pernyataan Iterasi (FOR)

Sebagai contoh bentuk FOR loop pada PL/SQL :


DECLARE
numberOfStaff NUMBER;
SELECT COUNT(*) INTO numberOfStaff FROM PropertyForRent
WHERE staffNo = ‘SG14’;myLoop1:
FOR iStaff IN 1 .. numberOfStaff LOOP
.....
END LOOP
myLoop1;
Pernyataan Kontrol
Dan sebagai contoh bentuk FOR loop pada standard SQL :
myLoop1:
FOR iStaff AS SELECT COUNT(*) FROM
PropertyForRent
WHERE staffNo = ‘SG14’ DO
.....
END FOR myLoop1;
Pernyataan Kontrol
✓ Pernyataan Iterasi (WHILE and REPEAT)
Pengecualian dalam PL / SQL
PL / SQL yang merupakan singkatan dari (Procedural
Language/Structured Query Language). SQL adalah sebuah bahasa yang
digunakan untuk mengakses data dalam basis data relasional.
Pengecualian adalah pengidentifikasi dalam PL / SQL yang dibangkitkan
selama eksekusi blok yang mengakhiri aksi utamanya. Blok selalu berakhir
ketika pengecualian dinaikkan, meskipun pawang pengecualian dapat
melakukan beberapa tindakan terakhir. Pengecualian dapat dimunculkan secara
otomatis oleh Oracle.
Contohnya: Pengecualian NO_DATA_FOUND dinaikkan setiap kali
tidak ada baris yang diambil dari database dalam pernyataan SELECT.
Dimungkinkan juga untuk pengecualian yang diajukan secara eksplisit
menggunakan pernyataan RAISE.
Contoh penanganan
pengecualian dalam PL / SQL

DECLARE
vpCount NUMBER;
vStaffNo BEGIN
PropertyForrent.staffNo%TYPE:=’SG14’; SELECT COUNT(*) INTO vpCount
-- mendefinisikan pengecualian ac untuk
kendala perusahaan yang mencegah anggota staf FROM PropertyForRent
-- mengelola lebih dari 100 properti
WHERE staffNo = vStaffNo;
e_too_many_properties EXCEPTION;
PRAGMA IF vpCount = 100
EXCEPTION_INIT(e_too_many_properties, -
20000); -- mengajukan pengecualian untuk kendala
umum
EXCEPTION RAISE e_too_many_properties;
menangani pengecualian untuk kendala umum
END IF;
WHEN e_too_many_properties THEN
dbms_output.put_line(‘Member of staff’ || UPDATE PropertyForRent SET staffNo =
staffNp || ‘already managing 100 properties’); vStaffNo WHERE propertyNo = ‘PG4’;
END;
Contoh penanganan
pengecualian dalam PL / SQL

DBMS_OUTPUT, yang memungkinkan output dari PL


/ SQL blok dan subprogram. Prosedur put_line menampilkan
informasi ke buffer di SGA (area memori bersama yang
digunakan untuk menyimpan data dan mengontrol informasi
untuk satu instance Oracle), yang dapat ditampilkan dengan
memanggil prosedur get_line atau dengan mengatur
SERVEROUTPUT ON dalam SQL * Plus
Penanganan kondisi
Bahasa SQL / Persistent Stored Modules (SQL / PSM)
mencakup penanganan kondisi untuk menangani pengecualian
dan kondisi penyelesaian. Penanganan kondisi berfungsi dengan
terlebih dahulu mendefinisikan handler dengan menentukan
jenisnya, kondisi pengecualian dan penyelesaian yang dapat
diselesaikan, dan tindakan yang diperlukan untuk
melakukannya (pernyataan prosedur SQL).
Penanganan untuk pengecualian terkait atau kondisi
penyelesaian dapat dinyatakan menggunakan DECLARE. . .
Pernyataan HANDLER:
Pernyataan HANDLER:

DECLARE {CONTINUE | EXIT | UNDO} HANDLER


FOR SQLSTATE {sqlstateValue | conditionName |
SQLEXCEPTION |
SQLWARNING | NOT FOUND} handlerAction;
Penanganan kondisi
Nama kondisi dan nilai SQLSTATE yang sesuai opsional dapat
dideklarasikan menggunakan:

DECLARE conditionName CONDITION


[FOR SQLSTATE sqlstateValue]

Kondisi pengecualian dapat ditandai menggunakan:

SIGNAL sqlstateValue; or RESIGNAL sqlstateValue;


Proses Penanganan (HANDLER)

Ketika pernyataan majemuk yang mengandung


deklarasi handler dieksekusi, handler dibuat
untuk kondisi terkait. Penangan diaktifkan ketika
penangan yang paling tepat untuk kondisi yang
telah dimunculkan oleh pernyataan SQL.

Jika handler telah menentukan LANJUTKAN, maka


pada aktivasi ia akan melakukan tindakan handler
sebelum mengembalikan kontrol ke pernyataan
majemuk.
Proses Penanganan (HANDLER)

Jika tipe handler EXIT, maka setelah menjalankan aksi handler, handler
meninggalkan pernyataan majemuk. Jika tipe handler adalah UNDO, maka
handler memutar kembali semua perubahan yang dibuat dalam pernyataan
gabungan, mengeksekusi aksi handler yang terkait, dan kemudian
mengembalikan kontrol ke pernyataan gabungan.

Jika handler tidak menyelesaikan dengan kondisi


penyelesaian yang sukses, maka pengunduran diri
implisit dieksekusi, yang menentukan apakah ada
handler lain yang dapat menyelesaikan kondisi
tersebut.
KURSOR DI PL/SQL

Pengertian Kursor
Cursor dapat diartikan sebagai suatu variabel yang
digunakan untuk menampung hasil query satu
baris/record atau lebih, di mana ia juga menjadi
penampung sekaligus pointer atas hasil eksekusi query.
Nilai-nilai yang disimpan dalam sebuah kursor
kemudian dapat dimanipulasi sehingga dapat digunakan
sesuai kebutuhan
KURSOR DI PL/SQL
1. Kursor Implisit (Implicit Cursor)

Implicit Cursor adalah cursor yang di deklarasikan dan dikelola


secara otomatis oleh PL/SQL untuk semua operasi SELECT
Statement dan DML (Data Manipulation Language). Implicit
cursor akan menghasilkan 1 row/record.
2. Kursor Eksplisit (Explicit Cursor)

Explicit Cursor adalah cursor yang didefiniskan pada bagian


deklarasi (DECLARE) dan biasanya menggunakan mekanisme
open, fetching, dan close cursor.
Atribut Pada Kursor
% NOTFOUND, yang menilai true jika tidak menghasilkan baris

% FOUND: bernilai true jika kursor menghasilkan baris yang berasil


diupdate atau didelete

% ISOPEN: bernilai True jika kursor terbuka.

% ROWCOUNT: Digunakan untuk menampilkan jumlah record yang


dihasilkan dari SELECT, UPDATE, dan DELETE statement.
Tahapan dalam kursor
1. Deklarasi (DECLARE)
Tahapan ini digunakan untuk mendeklarasikan sebuah cursor. Sintaknya
adalah:

CURSOR cursor_name IS SELECT ...;

2. Open
Tahapan ini digunakan untuk membuka atau mengaktifkan sebuah cursor.
Sintaknya adalah:

OPEN cursor_name;

3. Fetching Data (Mengambil data)


Tahapan ini digunakan untuk mengambil data dari sebuah cursor dan
ditampung dalam sebuah variabel yang telah ditentukan. Sintaknya adalah
:

FETCH cursor_name INTO variable_list;

4. CLOSE (Menutup cursor).


Tahapan ini digunakan untuk menutup atau me-nonaktifkan sebuah cursor.
Sintaknya adalah :

CLOSE cursor_name;
Contoh
Penggunaan
Kursor
UPDATE dengan CURSOR
Salah satu kemampuan cursor yaitu cursor dapat menunjuk
sekaligus mengUpdate banyak data di dalam database
Untuk melakukan proses update membutuhkan keyword UPDATE dan
keyword WHERE CURRENT OF.
Keyword Update, digunakan untuk mendefinisikan apa tujuan
dari cursor tersebut dibuat, sedangkan WHERE CURRENT OF digunakan
untuk menunjukan data yang mana yang ingin di UPDATE.
NB: keyword UPDATE disini bukan hanya sebatas untuk merubah data
menjadi data yang baru, tetapi juga termasuk UPDATE untuk
menghilangkan atau menghapus data.
Contoh update menggunakan kursor

DECLARE
CURSOR emp_cursor IS
SELECT employee_id FROM emp Sebelum diupdate
WHERE department_id = 20
FOR UPDATE OF Salary;
empId employees.employee_id%TYPE;
BEGIN
FOR emp_upd IN emp_cursor
LOOP Setelah diupdate
UPDATE emp
SET salary = 5000
WHERE CURRENT OF emp_cursor;
END LOOP;
COMMIT;
END;
Subprogram, Penyimpanan,
Prosedur, Fungsi, dan Paket
❖ Subprogram
(bagian-bagian program)

Prosedur
Merupakan penerapan konsep program modular, Fungsi
yaitu memecah-mecah program yang rumit Yaitu sebuah kumpulan statement
menjadi program-program bagian yang lebih yang akan mengembalikan sebuah
sederhana dalam bentuk prosedur-prosedur. nilai balik pada pemanggilnya.
Untuk hal-hal yang sering dilakukan berulang- Nilai yang dihasilkan Function
ulang, cukup dituliskan sekali saja dalam prosedur harus ditampung kedalam sebuah
dan dapat dipanggil atau dipergunakan sewaktu- variabel.
waktu bila diperlukan.
❖ Perbedaan Prosedur & Fungsi

Fungsi
Prosedur • Fungsi tersimpan
• Prosedur tersimpan tidak menghasilkan nilai ketika
menghasilkan nilai ketika dipanggil dan tentu saja
dipanggil. seperti fungsi biasa bisa
dipanggil di dalam suatu
• Prosedur dan fungsi yang pernyataan.
tersimpan dikenal dengan
sebutan routine. • Nilai yang dihasilkan oleh
fungsi tersimpan biasa disebut
nilai balik (return value).
❖ Persamaan Prosedur & Fungsi

❑ Menyediakan modularitas ❑Parameter memiliki nama dan


dan diperpanjang, tipe data tertentu tetapi juga
bisa ditetapkan sebagai:
❑ Mempromosikan • IN - Parameter hanya
reusability dan digunakan sebagai nilai input.
maintainability • OUT - Parameter hanya
❑ Membantu abstraksi digunakan sebagai nilai output.
• IN OUT - Parameter digunakan
sebagai input dan nilai output.
Contoh :

CREATE OR REPLACE PROCEDURE PropertiesForStaff


(IN vStaffNo VARCHAR2)
AS . . .
Prosedur kemudian dapat dieksekusi dalam SQL
* Plus sebagai:
SQL> SET SERVEROUTPUT ON;
SQL> EXECUTE PropertiesForStaff(‘SG14’)
Package (PL / SQL)

Pakckage adalah kumpulan prosedur, fungsi,


variabel, dan pernyataan SQL yang dikelompokkan
bersama dan disimpan sebagai satu unit program.

Oracle melakukan langkah-langkah berikut saat prosedur atau


package dibuat:
✓ Mengkompilasi prosedur atau paket.
✓ Menyimpan kode yang dikompilasi dalam memori.
✓ Menyimpan prosedur atau paket dalam database.
Contoh :
CREATE OR REPLACE PACKAGE
StaffPropertiesPackage AS
procedure PropertiesForStaff(vStaffNo
VARCHAR2);
END StaffPropertiesPackage;
#dan kita dapat membuat tubuh paket (yaitu,
implementasi paket) sebagai:
CREATE OR REPLACE PACKAGE BODY
StaffPropertiesPackage
AS. . .
END StaffPropertiesPackage;
Trigger
Trigger didefinisikan sebagai Format umum trigger dalam SQL adalah:

tindakan yang harus diambil CREATE TRIGGER NamaTrigger


BEFORE | AFTER | INSTEAD OF
database ketika beberapa INSERT | DELETE | UPDATE [OF
peristiwa terjadi dalam aplikasi. DaftarKolomTrigger]
ON NamaTabel
Trigger dapat digunakan sebagai
[REFERENCING {OLD | NEW} AS
pembatas beberapa batasan {OldName | NewName}
integritas referensial, untuk [FOR EACH {ROW | STATEMENT}]
[WHEN Kondisi]
menjalankan kendala yang <trigger action>
kompleks, atau untuk mengaudit
Kode di dalam trigger, disebut tubuh trigger
perubahan data. atau aksi trigger, dibuat dari blok SQL.
Trigger didasarkan pada model
Event-Condition – Action (ECA):

1. Event (atau events) yang mentrigger aturan, yang bisa berupa


INSERT, UPDATE, atau DELETE pernyataan pada tabel yang
ditentukan (atau mungkin tampilan).

Di Oracle, itu juga bisa:


- Pernyataan CREATE, ALTER, atau DROP pada objek
skema apa pun;
- startup basis data atau misal shutdown, atau login
atau keluar pengguna;
- pesan kesalahan tertentu atau pesan kesalahan
apa pun.
Trigger didasarkan pada model
Event-Condition – Action (ECA):

2. Kondisi yang menentukan 3. Tindakan yang harus


apakah tindakan harus diambil. Blok ini berisi
dieksekusi. Kondisi bersifat pernyataan SQL dan kode
opsional tetapi, jika yang akan dieksekusi ketika
ditentukan, tindakan akan pernyataan trigger
dieksekusi hanya jika dikeluarkan dan kondisi
kondisinya benar. trigger bernilai true.
Ada dua jenis trigger:
- row-level triggers (FOR SQL juga mendukung INSTEAD OF
EACH ROW) yang trigger, yang menyediakan cara
mengeksekusi setiap baris transparan untuk mengubah
tabel yang dipengaruhi tampilan yang tidak dapat
dimodifikasi secara langsung
oleh event trigger
melalui pernyataan SQL DML
- statement-level trigger (INSERT, UPDATE, dan DELETE).
(FOR EACH STATEMENT) Trigger ini disebut INSTEAD OF
yang mengeksekusi hanya trigger karena, tidak seperti jenis
sekali bahkan jika trigger lainnya, Trigger tersebut
dieksekusi sebagai ganti
beberapa baris
mengeksekusi pernyataan SQL asli.
dipengaruhi oleh event
trigger.
Contoh AFTER Row-level
Trigger
Membuat sebuah AFTER row-level trigger untuk menyimpan jejak audit dari
semua baris dimasukkan ke dalam tabel Staf.
CREATE TRIGGER StaffAfterInsert
AFTER INSERT ON Staff
REFERENCING NEW AS new
FOR EACH ROW
BEGIN
INSERT INTO StaffAudit
VALUES (:new.staffNo, :new.fName, :new.lName,
:new.position,:new.sex, :new.DOB, :new.salary,
:new.branchNo);
END;
Perhatikan bahwa standar SQL menggunakan NEW ROW, sebagai ganti NEW
dan OLD ROW sebagai ganti OLD.
Contoh menggunakan
BEFORE trigger
DreamHome memiliki aturan yang mencegah anggota staf mengelola lebih dari 100 properti pada saat
yang sama. Kita bisa membuat trigger yang ditunjukkan pada gambar untuk melaksanakan batasan ini.
Trigger ini dipanggil sebelum baris dimasukkan ke PropertyForRent.

CREATE TRIGGER StaffNotHandlingTooMuch tabel atau baris yang ada


BEFORE INSERT ON PropertyForRent diperbarui. Jika anggota staf saat
REFERENCING NEW AS newrow ini mengelola 100 properti,
sistem menampilkan pesan dan
FOR EACH ROW
membatalkan transaksi. Poin-
DECLARE poin berikut harus dicatat:
vpCount NUMBER; • Kata kunci BEFORE
BEGIN menunjukkan bahwa trigger
SELECT COUNT(*) INTO vpCount harus dijalankan sebelum
FROM PropertyForRent dimasukkan ke tabel
WHERE staffNo = :newrow.staffNo; PropertyForRent
IF vpCount = 100 • Kata kunci FOR EACH ROW
raise_application_error(- menunjukkan bahwa ini
adalah trigger tingkat baris,
2000,(‘Anggota’ || :newrow.staffNo ||
yang dieksekusi untuk setiap
‘sudah mengelola 100 properti’); baris tabel PropertyForRent
END IF; yang diperbarui dalam
END; pernyataan.
Contoh menggunakan trigger untuk
melaksanakan integritas referensial

Secara default, Oracle memberlakukan tindakan


referensial ON DELETE NO ACTION dan ON UPDATE NO
ACTION pada foreign key yang disebutkan.
Itu juga memungkinkan klausa tambahan ON DELETE CASCADE
yang akan ditentukan untuk memungkinkan penghapusan
tabel induk menuju ke tabel anak.
Namun itu tidak mendukung tindakan ON UPDATE
CASCADE, atau SET DEFAULT dan SET NULL. Jika ada tindakan
ini diperlukan, mereka harus diimplementasikan sebagai
trigger atau prosedur tersimpan, atau dalam kode aplikasi.
Trigger I (PropertyForRent_Check_Before)
Trigger pada gambar dieksekusi setiap kali kolom staffNo di tabel PropertyForRent diperbarui. Trigger memeriksa
sebelum pembaruan terjadi apakah nilai baru yang ditentukan ada di tabel Staf. Jika pengecualian Invalid_Staff
dimunculkan, trigger pesan kesalahan dan mencegah perubahan terjadi
Perubahan untuk menaruh trigger pada tabel Staff

Tiga trigger yang ditunjukkan pada gambar dieksekusi setiap kali kolom
staffNo di tabel Staf diperbarui. Sebelum penentuan trigger, nomor urut
updateSequence dibuat, bersama dengan updateSeq variable publik (yang
dapat diakses ke tiga trigger melalui paket seqPackage).
Selain itu, tabel PropertyForRent dimodifikasi untuk menambahkan kolom
yang disebut updateId, yang digunakan untuk menandai apakah suatu baris
telah diperbarui, untuk mencegahnya diperbarui lebih lama dari satu kali
selama operasi berjalan.
Trigger 2 (Cascade_StaffNo_Update1)
Trigger ini (statement-level) dijalankan sebelum update ke kolom staffNo di tabel Staf untuk mengatur
nomor urut baru untuk update.

Trigger 3 (Cascade_StaffNo_Update2)
Trigger ini (statement-level) dijalankan untuk memperbarui semua baris di tabel PropertyForRent yang
memiliki nilai staffNo lama (:old.staffNo) ke nilai baru (:new.staffNo), dan untuk menandai baris yang
telah diperbarui.

Trigger 4 (Cascade_StaffN0_Update3)
Trigger akhir (statement-level) akan dijalankan setelah update untuk mengatur ulang baris yang ditandai
kembali untuk tanpa tanda.

Penghapusan Trigger
Trigger dapat dihapus dengan menggunakan statement DROP TRIGGER <Trigger Name> .

Privilege TRIGGER
Untuk membuat trigger pada tabel, pengguna harus menjadi pemilik tabel (dalam hal ini pengguna akan
mewarisi privilege TRIGGER) atau yang harus dimiliki oleh pengguna setelah diberikan privilege TRIGGER
pada tabel.
Kelebihan dan Kekurangan Trigger
Ada sejumlah kelebihan dan kekurangan Trigger pada trigger basis data. Kelebihan trigger termasuk :
– Penghapusan kode yang berlebihan (redundant). Alih-alih menempatkan salinan fungsionalitas
trigger di setiap aplikasi klien yang membutuhkannya, trigger disimpan hanya sekali dalam basis data.
– Modifikasi yang disederhakan. Mengubah trigger memerlukan mengubahnya di satu tempat saja;
semua aplikasi secara otomatis menggunakan trigger yang diperbarui. Jadi, mereka hanya diberi kode
sekali, diuji satu kali, dan kemudian diberlakukan secara terpusat untuk semua aplikasi yang
mengakses basis data. Trigger biasanya dikendalikan, atau setidaknya diaudit, oleh DBA terampil.
Hasilnya bahwa trigger dapat diimplementasikan secara efisien.
– Keamanan meningkat. Menyimpan trigger dalam database memberi mereka semua manfaat
keamanan yang disediakan secara otomatis oleh DBMS.
– Integritas meningkat. Trigger bisa sangat berguna untuk mengimplementasikan beberapa jenis
kendala integritas, seperti yang telah kami tunjukkan sebelumnya. Menyimpan trigger seperti itu di
database berarti bahwa kendala integritas dapat ditegakkan secara konsisten oleh DBMS di semua
aplkasi.
– Peningkatan daya pemrosesan. Trigger menambahkan kekuatan pemrosesan ke DBMS dan ke
database secara keseluruhan.
– Sangat cocok dengan arsitektur client-server. Aktivasi pusat dan pemrosesan trigger cocok dengan
arsitektur client-server dengan baik. Satu permintaan dari klien dapat menghasilkan kineja otomatis
dari seluruh urutan pemeriksaan dan operasi selanjutnya oleh server database. Dengan cara ini,
kinerja berpotensi ditingkatkan karena data dan operasi tidak ditransfer di seluruh jaringan antara
klien dan server.
Kelebihan dan Kekurangan Trigger
Trigger juga memiliki kekurangan, yaitu:
- Overhead Kinerja. Manajemen dan pelaksanaan trigger memiliki kinerja
overhead yang harus diseimbangkan dengan keuntungan yang
disebutkan sebelumnya.
- Efek cascading. Tindakan satu trigger dapat menyebabkan trigger lain
untuk dihapus, dan seterusnya, dengan cara mengalir. Ini tidak hanya
dapat menyebabkan perubahan signifikan pada database, tetapi juga
bisa sulit untuk memperkirakan efek ketika merancang trigger.
- Tidak bisa dijadwalkan. Trigger tidak bisa dijadwalkan; mereka terjadi
ketika peristiwa itu didasarkan pada apa yang terjadi.
- Kurang portable. Meskipun sekarang dicakup oleh standar SQL,
kebanyakan DBMS menerapkan dialek mereka sendiri untuk trigger,
yang memengaruhi portabilitas.
Pengulangan (Recursion)

Atomitas data berarti bahwa kelompok berulang tidak


diperbolehkan dalam model relasional. Akibatnya, sangat sulit
untuk menangani permintaan rekursif, yaitu pertanyaan
tentang hubungan yang dimiliki suatu hubungan dengan
dirinya sendiri (langsung atau tidak langsung).

Untuk menggambarkan operasi baru, kami


menggunakan contoh hubungan Staf yang disederhanakan,
yang menyimpan nomor staf dan nomor staf manajer yang
sesuai.
Untuk menemukan semua manajer dari
semua staf, kita dapat menggunakan kueri
rekursif berikut di SQL::

WITH RECURSIVE Query ini membuat tabel hasil


AllManagers (staffNo, managerStaffNo) AS AllManagers dengan dua kolom
staffNo dan managerStaffNo
(SELECT staffNo, managerStaffNo yang berisi semua manajer dari
FROM Staff semua staf. Operasi UNION
dilakukan dengan mengambil
UNION gabungan semua baris yang
SELECT in.staffNo, out.managerStaffNo dihasilkan oleh blok dalam
hingga tidak ada baris baru yang
FROM AllManagers in, Staff out
dihasilkan. Catatan, jika telah
WHERE in.managerStaffNo = out.staffNo); menetapkan UNION ALL, nilai
duplikat apa pun akan tetap ada
SELECT * FROM AllManagers
di tabel hasil.
ORDER BY staffNo, managerStaffNo;
Pernyataan rekursi memungkinkan
spesifikasi dua urutan:
• Depth-first, setiap item 'induk' atau 'mengandung' muncul di
hasil sebelum item yang dikandungnya, serta sebelum
'saudara kandungnya' (item dengan induk yang sama) atau
wadah);
• Breadth-first, setiap item mengikuti 'saudara mereka' tanpa
mengikuti anak-anak saudara mereka.

Misalnya, di akhir pernyataan WITH RECURSIVE kita bisa menambahkan klausa


berikut:
SEARCH BREADTH FIRST BY staffNo, managerStaffNo SET orderColumn
Klausa SET mengidentifikasikan nama kolom baru (orderColumn), yang digunakan
oleh SQL untuk memesan hasilnya ke dalam traversal breadth-first yang diperlukan.
Pernyataan rekursif memiliki klausa CYCLE
yang menginstruksikan SQL untuk mencatat
nilai yang ditentukan untuk menunjukkan
bahwa baris baru telah ditambahkan ke tabel
hasil. Setiap kali baris baru ditemukan, SQL
memeriksa bahwa baris belum ditambahkan
sebelumnya dengan menentukan apakah baris
telah ditandai dengan nilai yang ditentukan.
Jika sudah, maka SQL mengasumsikan siklus
telah ditemukan dan berhenti mencari baris
hasil lebih lanjut.
Contoh klausa CYCLE adalah:
CYCLE staffNo, managerStaffNo SET cycleMark TO ‘Y’
DEFAULT ‘N’ USING cyclePath

cycleMark dan cyclePath adalah nama kolom yang


ditentukan pengguna untuk SQL untuk digunakan secara
internal.
cyclePath adalah ARRAY dengan kardinalitas yang cukup
besar untuk mengakomodasi jumlah baris dalam hasil
dan tipe elemen yang merupakan tipe baris dengan
kolom untuk setiap kolom dalam daftar kolom siklus
(staffNo dan managerStaffNo dalam contoh kami).
RINGKASAN BAB
Versi awal bahasa SQL tidak memiliki SQL / PSM mendukung deklarasi
konstruksi pemrograman; artinya, itu variabel dan memiliki pernyataan
tidak lengkap secara komputasional. penugasan, aliran pernyataan
Namun, dengan versi standar yang lebih kontrol (IF-THENELSE-END IF;
baru, SQL sekarang menjadi bahasa LOOP-EXIT WHOP-END LOOP;
pemrograman lengkap dengan ekstensi UNTUK-END LOOP; LOOP-
yang dikenal sebagai SQL / PSM WHILE-END LOOP), dan
(Persistent Stored Modules). pengecualian.

Pernyataan SELECT dapat digunakan jika kueri mengembalikan satu dan hanya satu
baris. Untuk menangani kueri yang dapat mengembalikan jumlah baris sewenang-
wenang (yaitu, nol, satu, atau lebih baris), SQL menggunakan kursor untuk
memungkinkan baris hasil kueri diakses satu per satu. Akibatnya, kursor bertindak
sebagai penunjuk ke baris tertentu dari hasil permintaan. Kursor dapat dimajukan
satu untuk mengakses baris berikutnya. Kursor harus dinyatakan dan dibuka sebelum
dapat digunakan, dan harus ditutup untuk menonaktifkannya setelah tidak lagi
diperlukan. Setelah kursor dibuka, baris hasil kueri dapat diambil satu per satu
menggunakan pernyataan FETCH, yang bertentangan dengan pernyataan SELECT.
RINGKASAN BAB
Trigger mendefinisikan tindakan yang harus diambil oleh database ketika
beberapa peristiwa terjadi dalam aplikasi. Trigger dapat digunakan untuk
menegakkan beberapa batasan integritas referensial, untuk menegakkan batasan
integritas yang kompleks, atau untuk mengaudit perubahan data. Trigger
didasarkan pada model Event-Condition-Action (ECA): peristiwa (atau peristiwa)
yang memicu aturan, kondisi yang menentukan apakah tindakan harus dieksekusi,
dan tindakan yang harus diambil.

Subprogram diberi nama blok PL / SQL yang dapat mengambil parameter dan
dipanggil. PL / SQL memiliki dua jenis subprogram yang disebut (tersimpan)
prosedur dan fungsi. Prosedur dan fungsi dapat mengambil satu set parameter
yang diberikan kepadanya oleh program panggilan dan melakukan serangkaian
tindakan. Keduanya dapat memodifikasi dan mengembalikan data yang
diteruskan kepada mereka sebagai parameter. Perbedaan antara prosedur dan
fungsi adalah bahwa fungsi akan selalu mengembalikan nilai tunggal ke
pemanggil, sedangkan prosedur tidak. Biasanya, prosedur digunakan kecuali
hanya satu nilai kembali yang diperlukan.
RINGKASAN BAB

Keuntungan dari trigger meliputi: menghilangkan kode yang


berlebihan, menyederhanakan modifikasi, meningkatkan
keamanan, meningkatkan integritas, meningkatkan daya
pemrosesan, dan cocok dengan arsitektur server-klien. Kerugian
pemicu meliputi: kinerja overhead, efek cascading,
ketidakmampuan untuk dijadwalkan, dan kurang portabel.

Anda mungkin juga menyukai