Pada kegiatan ngoprek kali ini saya akan membahas mengenai insert data ke dalam table secara rekursif. Yang dimaksud dengan insert data secara rekursif pada tulisan ini adalah memasukkan data ke tabel dengan datanya berasal dari tabel yang akan di insert tersebut. Bingung kan? Gak usah khawatir, nanti kalau udah masuk ke contoh kasusnya bisa mengerti koq apa yang dimaksud. Kegiatan ngoprek kali ini lebih ditekankan pada penggunaan syntax SQL dimana tool yang akan digunakan adalah Netbeans dan Apache Derby. Untuk memulai kegiatan ini ada baiknya anda membaca tulisan saya sebelumnya yaitu JAVA DB Dengan Apache Derby di Netbeans. Jika anda menggunakan DBMS lainnya maka anda bisa mencari padanan dari fungsi-fungsi yang dijelaskan di DBMS yang anda gunakan.
Jika anda pernah menangani aplikasi messaging dengan memanfaatkan multithread untuk keperluan mengirim/menerima data maka data yang akan dikirimkan atau diterima biasanya disimpan ke dalam suatu tabel. Lalu ada suatu modul atau aplikasi (menggunakan thread) untuk membaca/menyimpan data dari/ke dalam tabel. Setelah modul selesai dikerjakan tentunya kita ingin melakukan pengujian terhadap kestabilan modul tersebut. Proses pengujian tersebut tentunya membutuhkan data yang banyak tidak hanya 100 atau 200 buah data. Pada kegiatan ngoprek kali ini saya ingin menuliskan tentang syntax SQL untuk insert ke data tersebut sehingga jumlah data yang akan di test bisa memenuhi kebutuhan anda. Baik tanpa panjang lebar mari kita mulai praktikumnya.
1. Buat Tabel Untuk Simulasi
Jalankan perintah berikut ini untuk membuat sebuah tabel tentunya setelah connect ke database yang sudah kita buat.
CREATE TABLE T_MESSAGES ( ID VARCHAR(20) NOT NULL, -- id message MSGS VARCHAR(100) NOT NULL, -- pesan yang akan dikirimkan SENT SMALLINT DEFAULT 0 NOT NULL, -- 0 = belum terkirim, 1 = terkirim PRIMARY KEY (ID) );
2. Insert Satu Buah Data Dummy Ke Dalam Tabel
Pada langkah ini kita akan menambahkan sebuah data dummy untuk keperluan di-insertkan secara rekursif. Adapun syntaxnya dapat dilihat pada source code berikut:
INSERT INTO T_MESSAGES (ID, MSGS, SENT) VALUES (TIMESTAMP_TO_CHAR(CURRENT_TIMESTAMP, 'HHmmssSSS'), 'dummy_messages', 0));
Jika anda jalankan langsung perintah tersebut mungkin akan terdapat error untuk itu ada sebaiknya membaca tulisan membuat fungsi custom pada apache derby terlebih dahulu.
3. Jalankan Perintah Insert Rekursif ke Dalam Tabel
Pada langkah ini, jalankan perintah berikut berulang kali sampai didapatkan jumlah data yang diinginkan. Pada perintah ini apabila dijalankan maka akan menghasilkan data berikut: 1, 2, 4, 8 dan seterusnya.
INSERT INTO t_messages SELECT TRIM(CAST((CAST(m.id as BIGINT) + CAST(TIMESTAMP_TO_CHAR(CURRENT_TIMESTAMP, 'mmssSSS') as BIGINT)) AS CHAR(20))), m.msgs, m.sent FROM T_MESSAGES m ;
Pada syntax SQL diatas jika ada perintah-perintah yang asing di DBMS yang anda gunakan sebaiknya dicari padanan dari fungsi-fungsi tersebut. Adapun ide dari syntax diatas adalah menambahkan kolom id dengan current_time (tentunya setelah kedua data di casting menjadi integer) kemudian setelah dijumlahkan maka hasil penjumlahan akan di casting kembali menjadi bentuk varchar.
TroubleShooting
Jika saat menjalankan syntax SQL pada langkah ketiga ditemui error duplicate data maka anda bisa menunggu beberapa saat untuk kemudian query dapat dijalankan kembali. Jika setelah menunggu masih muncul error yang sama karena sudah tidak ada kemungkinan untuk insert kembali, anda bisa memainkannya dengan mengubah parameter mmssSSS menjadi misal HHmmssSSS atau yang lainnya (terserah kreativitas anda). Demikian kegiatan ngoprek ini saya dokumentasikan, semoga dapat bermanfaat. Terima Kasih.
Sumber: Pengalaman Pribadi.