Total Tayangan Halaman

Rabu, 11 Juni 2008

The Beauty of Code

Hari ini aku nemu masalah saat coding. Aku punya dua tabel (di database). Tabel pertama memuat data agent dan tabel kedua memuat data nomor telepon. jumlah agent lebih dari 20, sedangkan jumlah nomor telepon lebih dari 15.000, aku ingin mendistribusikan seluruh data nomor telepon ke agen-agen yang terdaftar di database. Distribusi harus adil (sama rata). Aku harus solve problem ini dengan Store procedure di Oracle.

Pertama aku pikir bisa menyelesaikan case ini dengan memakai dua cursor, tapi saat diconba mengimplementasikankannya aku sangat kesulitan. Cursor di dalam cursor menghasilkan perkalin bukan pembagian. Satu-satunya yang terpikir olehku adalah menyelesaikannya dengan array atau list yang biasa aku gunakan dalam bahasa pemrogramman java. Sedangkan aplikasi yang aku buat menggunakan php. Sudah aku coba melakukan distribusi ini dari kode php. Tapi hasilnya tidak sesuai dengan harapanku. Untuk data kecil kisaran 100 lebih ok. Tapi untuk data ribuan aplikasi php sudah timeout. Satu-satunya cara memindahkan kode php ke store proedure di oracle. Tapi ada ga ya satu tipe data yang mirip array gitu. Aku iseng cari bantuan dokter google dengan keyword "array in oracle", hasilnya aku nemu link ini, aha langsung aku coba dan langsung sukses dengan waktu kurang dari 2 menit.

Berikut potongan kode yang saya buat di oracle :

PROCEDURE edit_CIA_Jumlah_Call(i_Upload_by IN VARCHAR2) IS


TYPE agent IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
agent_id agent;
agent_name VARCHAR2(50);
upl_no NUMBER;
v_dn VARCHAR2(20);
jumlah_agent NUMBER;
index_agent NUMBER;
index_dn NUMBER;


CURSOR user_id IS SELECT user_id FROM CRM_DBM.SURVEY_USERS WHERE DEPT_ID = 'COLLECTION' ORDER BY USER_ID;

CURSOR dn IS SELECT upload_no,DN FROM CRM_DBM.KENNY_TEST WHERE Call_By IS NULL AND activity_status != 'O' OR activity_status IS NULL ORDER BY upload_no;


BEGIN
index_agent := 1;
index_dn := 1;
SELECT COUNT(1) INTO jumlah_agent FROM CRM_DBM.SURVEY_USERS WHERE DEPT_ID =
'COLLECTION' ORDER BY USER_ID;

OPEN user_id;
LOOP
FETCH user_id INTO agent_name;
EXIT WHEN user_id%NOTFOUND;
agent_id(index_agent) := agent_name;
index_agent := index_agent + 1;
END LOOP;
CLOSE user_id;

OPEN dn;
LOOP
FETCH dn INTO upl_no, v_dn;
EXIT WHEN dn%NOTFOUND;
index_agent := index_dn MOD jumlah_agent;
IF(index_agent = 0) THEN
index_agent := jumlah_agent;
END IF;

UPDATE CRM_DBM.KENNY_TEST SET call_by =agent_id(index_agent), upload_by
=i_Upload_by, Activity_Status ='N' WHERE DN=v_dn AND upload_no=upl_no AND
CALL_STATUS_ID IS NULL;
COMMIT;

index_dn := index_dn + 1;

END LOOP;
CLOSE dn;


EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);


END edit_CIA_Jumlah_Call;

Kamis, 05 Juni 2008

FPI dan BBM

Hebat ya pemerintah kita. Tadinya demo menolak kenaikan BBM terus meluas. Tapi dengan adanya kasus kekerasan FPI terhadap Aliansi Kebangsaan, semua orang melupakan kasus kenaikan BBM. Ahmadiyyah dan FPI menjadi tools yang ampuh untuk menghapus memori orang tentang kenaikan BBM.

Salut. Salut gw sama pemerintah kita.