Home > World Of Academic > Belajar Triger di Oracle

Belajar Triger di Oracle


Trigger adalah blok PL/SQL yang disimpan dalam database dan akan diaktivasi ketika  kita melakukan statement-statement SQL (DELETE, UPDATE, dan INSERT) pada sebuah  tabel. Aktivasi trigger didasarkan pada event yang terjadi di dalam tabel tersebut sehingga trigger dapat membantu dalam menjaga integritas dan konsistensi data. Implementasi trigger  yang sering ditemui dalam dunia nyata adalah untuk mengeset dan mengubah nilai kolom  dalam suatu tabel sehingga validasi nilai dari tabel tersebut akan terjaga. Adanya trigger  dalam database akan meringankan kita dalam pembuatan aplikasi karena di dalam aplikasi  yang kita buat, kita tidak perlu lagi untuk melakukan validasi data.

Oracle telah menyediakan statement CREATE TRIGGER untuk membuat sebuah  trigger yang selanjutnya akan diaktivasi berdasarkan event tertentu. Secara umum, event trigger terbagi menjadi dua, yaitu BEFORE (sebelum) dan AFTER (setelah) Insert, Update, Delete .Event tersebut  menandakan kapan trigger akan diaktivasi, apakah sebelum ataukah sesudah proses yang  dilakukan di dalam tabel bersangkutan.

Skenario Percobaan.

Data:
 X,
 Y,
 Z=2X10 + 3X9Y + 4X8Y2 + 5X7Y3 + 6X6Y4 + 7X5Y5 + 6X4Y6 + 5X3Y7 + 4X2Y8 + 3XY9 + 2Y10

Buat tabel XYZ1 dengan data berikut:

KOLOM TIPE PANJANG NULLITY KETERANGAN
ID NUMBER NOT NULL PK
X NUMBER NOT NULL
Y NUMBER NOT NULL
CREATE TABLE XYZ1
   (    ID NUMBER NOT NULL, 
    X NUMBER NOT NULL, 
Y NUMBER NOT NULL,
    CONSTRAINT XYZ1_PK PRIMARY KEY (ID)
   );

Generate data dummy!

BEGIN
    FOR I IN 1 .. 999999 LOOP
        INSERT INTO XYZ1 VALUES(I,MOD(I,9)+1,MOD(I,8)+1);
    END LOOP;
END;

Buat kode PHP pada file getSumZ.php yang menghitung jumlah Z, dan menampilkan waktu prosesnya. Jalankan melalui browser pada server lokal!

<?php

ini_set('max_execution_time',600);
error_reporting(0);

$username = "oracle"; //Sesuaikan!
$password = "oracle"; //Sesuaikan!
$conn = oci_connect($username, $password);

$start=time();
echo getSumZ1($conn)."<br>\n";
$finish=time();
echo "time: ". ($finish - $start) ." seconds<br>\n";

$start=time();
echo getSumZ2($conn)."<br>\n";
$finish=time();
echo "time: ". ($finish - $start) ." seconds<br>\n";

function getSumZ1($conn)
{
  $stmt = oci_parse($conn, "SELECT X,Y FROM XYZ1");
  oci_execute($stmt, OCI_DEFAULT);

    $sumZ = 0;
    while ($row = oci_fetch_assoc($stmt)) {
        $x = $row["X"];
        $y = $row["Y"];
        $z = 2 * pow($x,10) * pow($y,0) +
             3 * pow($x,9) * pow($y,1) +
             4 * pow($x,8) * pow($y,2) +
             5 * pow($x,7) * pow($y,3) +
             6 * pow($x,6) * pow($y,4) +
             7 * pow($x,5) * pow($y,5) +
             6 * pow($x,4) * pow($y,6) +
             5 * pow($x,3) * pow($y,7) +
             4 * pow($x,2) * pow($y,8) +
             3 * pow($x,1) * pow($y,9) +
             2 * pow($x,0) * pow($y,10);
        $sumZ += $z;
    }
    return $sumZ;
}

function getSumZ2($conn)
{
  $stmt = oci_parse($conn, "SELECT SUM(
                                2*POWER(X,10)*POWER(Y,0) +
                                3*POWER(X,9)*POWER(Y,1) +
                                4*POWER(X,8)*POWER(Y,2) +
                                5*POWER(X,7)*POWER(Y,3) +
                                6*POWER(X,6)*POWER(Y,4) +
                                7*POWER(X,5)*POWER(Y,5) +
                                6*POWER(X,4)*POWER(Y,6) +
                                5*POWER(X,3)*POWER(Y,7) +
                                4*POWER(X,2)*POWER(Y,8) +
                                3*POWER(X,1)*POWER(Y,9) +
                                2*POWER(X,0)*POWER(Y,10)
                            ) AS SUMZ2 FROM XYZ1");
  oci_execute($stmt, OCI_DEFAULT);

    $row = oci_fetch_assoc($stmt);
    $sumZ = $row["SUMZ2"];
    return $sumZ;
}
    
?>

Buat tabel XYZ2 dengan data berikut:

KOLOM TIPE PANJANG NULLITY KETERANGAN
ID NUMBER NOT NULL PK
X NUMBER NOT NULL
Y NUMBER NOT NULL
Z NUMBER NOT NULL
CREATE TABLE XYZ2
   (    ID NUMBER NOT NULL, 
    X NUMBER NOT NULL, 
Y NUMBER NOT NULL,
Z NUMBER NOT NULL,
    CONSTRAINT XYZ2_PK PRIMARY KEY (ID)
   );

Buat Trigger untuk set Z otomatis.

CREATE OR REPLACE TRIGGER "XYZ2_T1" 
BEFORE
insert on "XYZ2"
for each row
begin
:NEW.Z :=
2*POWER(:NEW.X,10)*POWER(:NEW.Y,0) +
3*POWER(:NEW.X,9)*POWER(:NEW.Y,1) +
4*POWER(:NEW.X,8)*POWER(:NEW.Y,2) +
5*POWER(:NEW.X,7)*POWER(:NEW.Y,3) +
6*POWER(:NEW.X,6)*POWER(:NEW.Y,4) +
7*POWER(:NEW.X,5)*POWER(:NEW.Y,5) +
6*POWER(:NEW.X,4)*POWER(:NEW.Y,6) +
5*POWER(:NEW.X,3)*POWER(:NEW.Y,7) +
4*POWER(:NEW.X,2)*POWER(:NEW.Y,8) +
3*POWER(:NEW.X,1)*POWER(:NEW.Y,9) +
2*POWER(:NEW.X,0)*POWER(:NEW.Y,10);
end;

Generate data dummy.

BEGIN
    FOR I IN 1 .. 999999 LOOP
        INSERT INTO XYZ2 VALUES(I,MOD(I,9)+1,MOD(I,8)+1,NULL);
    END LOOP;
END;

Tambahkan code berikut pada file getSumZ.php dan refresh file tersebut di browser.

$start=time();
echo getSumZ3($conn)."<br>\n";
$finish=time();
echo "time: ". ($finish - $start) ." seconds<br>\n";

function getSumZ3($conn)
{
  $stmt = oci_parse($conn, "SELECT SUM(Z) AS SUMZ3 FROM XYZ2");
  oci_execute($stmt, OCI_DEFAULT);

    $row = oci_fetch_assoc($stmt);
    $sumZ = $row["SUMZ3"];
    return $sumZ;
}

Dibawah ada perbandingan waktu eksekusi hasil query antara tidak menggunakan trigger dan menggunakan trigger

Non Trigger

Menggunakan Trigger

So Kesimpulan percobaan kali ini, penggunaan trigger efektif digunakan pada data berukuran besar.

  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: