Oracle Procedure/Function Update dan Order (Urutan)

No Comments
Aduh mak!!. Saya punya aplikasi dimana aplikasi tersebut harus mengurutkan ketika kita memilih ordering data, gimana ya menjelaskannya. Yaitu mengurutkan data dari urutan record data yang sudah ada, sehingga terbentuklah urutan yang baru, sesuai yang diinginkan. Ada yang paham kata-kata ini gak ya? #palu, okelah para permirsa. Contohnya, saya punya table buah, bagi Anda yang belum terlalu paham cara membuat table, bisa disimak tutorial dari w3shools.com ini. Dan kurang lebih untuk table buah saya yang dibuat di Oracle, dapat disimak strukturnya

TABLE BUAH
ID                      VARCHAR(2)
NAMA                    VARCHAR2(20)
PARENT                  VARCHAR(2)
URUTAN                  NUMBER
PRIMARY KEY (ID) 
INDEX CONSTRAINT (PARENT, URUTAN)

dan setelah saya insert beberapa data, kurang lebihnya menjadi seperti ini

IDNAMAPARENTURUTAN
1Pohon Berbuah01
2Mangga11
3Pisang12
4Jambu13
5Sirsat14
6Pohon Merambat02
7Markisa21
8Anggur22

Nah, untuk data parent dan urutan sudah saya constraint sebagai primary key, sehingga mau tidak mau jika saya mengupdate mangga menjadi urutan ke 3, dengan parent 1 yaitu pohon berbuah, maka yang perlu dilakukan adalah pisang dan jambu bergeser ke bawah dan mangga menempati urutan ke 3. Dan datanya menjadi

IDNAMAPARENTURUTAN
1Pohon Berbuah01
3Pisang11
4Jambu12
2Mangga13
5Sirsat14
6Pohon Merambat02
7Markisa21
8Anggur22

Setelah browsing kesana-kemari yang belum membuahkan hasil, akhirnya saya membuat procedure/function oracle sendiri. kurang lebih scriptnya seperti ini

CREATE FUNCTION URUT_BUAH(P_PARENT VARCHAR, P_IDBUAH VARCHAR, P_NAMABUAH VARHCAR2, P_URUTAN NUMBER) RETURN VARCHAR2
IS 
 V_JUMLAH NUMBER; 
 V_URUT NUMBER; 
 V_MAXURUT NUMBER; 
BEGIN
 
 -- untuk mengambil jumlah record, dan urutan semula
 SELECT COUNT(1), URUTAN INTO V_JUMLAH V_URUT FROM BUAH WHERE ID = P_IDBUAH;
 -- untuk mengambil urutan terakhir ditambah satu, jika ingin insert yang baru.
 SELECT NVL(MAX(URUTAN), 0)+1 INTO V_MAXURUT FROM BUAH WHERE PARENT = P_PARENT;

-- jika idbuah ada, dan ingin diurutkan sesuai urutan maka
IF V_JUMLAH = 1 THEN
 -- jika urutan lebih besar dari urutan semula 
 IF P_URUTAN > V_URUT THEN
    UPDATE BUAH SET URUTAN = 0 WHERE ID = P_IDBUAH;
    FOR I IN V_URUT .. P_URUTAN-1 LOOP
     UPDATE BUAH SET URUTAN = I WHERE URUTAN = (I+1) AND PARENT = P_PARENT;
    END LOOP;
    UPDATE BUAH SET URUTAN = P_URUTAN WHERE ID = P_IDBUAH;
 
 -- jika urutan lebih kecil dari urutan semula
 ELSIF P_URUTAN < V_URUT THEN
    UPDATE BUAH SET URUTAN = 0 WHERE ID = P_IDBUAH;
    FOR I IN REVERSE P_URUTAN+1 .. V_URUT LOOP
      UPDATE BUAH SET URUTAN = I WHERE URUTAN = (I-1) AND PARENT = P_PARENT;
    END LOOP;
    UPDATE BUAH SET URUTAN = P_URUTAN WHERE ID = P_IDBUAH;
 END IF;
 RETURN 'DATA TELAH DIURUTKAN';

-- jika idbuah belum pernah ada, maka tambahkan record
ELSIF V_JUMLAH = 0 THEN
 INSERT INTO BUAH (ID, NAMA, PARENT, URUTAN) VALUES (P_IDBUAH, P_NAMABUAH, P_PARENT, V_MAXURUT); 
 RETURN 'DATA TELAH TERINSERT'; 

ELSE
 RETURN 'ADA KESALAHAN BRO!'; 
END IF;
END URUT_BUAH;


Kalau kurang jelas dapat ditanyakan ya!.
nah, bagaimana jika saya ingin mengubah parent juga Pak? kita simak dan tunggu tutorial selanjutnya
Next PostNewer Post Previous PostOlder Post Home

0 comments

Post a Comment