Archive for the 'oracle' Category

11
Oct
10

How to Recognize DML Origins within Table

Pernahkah anda mengalami kondisi dimana nilai pada suatu kolom di Table X berubah tanpa sepengetahuan kita, atau, dengan kata lain, kita tidak tahu SQL Object (Packages, Function, etc) yang melakukan DML terhadap Table X?

Berikut ini contoh untuk memonitornya menggunakan bantuan trigger.. (kasus DML Update)

CREATE OR REPLACE TRIGGER <schema>.<trigger_name>
 BEFORE UPDATE OF <nama_kolom_yg_mau_dimonitor>
 ON <schema>.<nama_table>
 REFERENCING NEW AS NEW OLD AS OLD
 FOR EACH ROW
DECLARE
 vchstr      VARCHAR2 (32767);
BEGIN
 FOR arec IN (SELECT USER, program, machine, obj.object_name,sq.sql_text
 FROM v$session s,
 v$sql sq
 ,dba_objects obj
 WHERE s.audsid = USERENV ('sessionid')
 AND sq.sql_id = s.sql_id
 and obj.object_id = sq.program_id)
 LOOP
 vchstr :=
 'USER:'
 || TRIM (arec.USER)
 || '_PROG:'
 || TRIM (arec.program)
 || '_@:'
 || TRIM (arec.object_name)
 || '@SQL:'
 || TRIM (arec.sql_text);
 EXIT;
 END LOOP;

 <panggil program untuk menulis VCHSTR ke dalam log table>

EXCEPTION
 WHEN OTHERS
 THEN
 -- Consider logging the error and then re-raise
 RAISE;
END;

That’s it. Hope it helps..

Advertisements
15
Feb
10

SQL Rowcount

Semuanya berawal minggu lalu. Karena lama ga pake jurus yang satu ini jadi harus digugel ulang ( dari kata kerja “gugel” ditambah awalan “di-” ).

So, kasusnya waktu itu adalah mengetahui jumlah record yang terupdate di database,
pada saat dilakukan UPDATE statement dari Oracle forms. Cara yang sepintas terpikir adalah melakukan select count dengan kondisi / where yang ada. Tidak efisien bukan? tentu saja. Bisa-bisa diomelin om DBA kalo mesin tiba2 ngadat.

Begini kurang lebih cara pakai jurusnya :

declare
nmbrowsaffected number := 0;
begin
update xxx
set col_a = ...
where ...;

nmbrowsaffected := sql%rowcount;

if nmbrowsaffected = 0 then
message('No effect bro..');
db_rollback;
else
db_commit;
end if;
end;

Cukup mudah bukan.. saya saja bisa, apalagi anda… sebagai catatan, sql rowcount ini hanya menghitung open dml/syntax yang terakhir dilakukan. Jadi apabila ada update sebelum update, yang terhitung hanya jumlah record terupdate yang terakhir.

Selain itu, untuk DML lainnya kurang lebih perlakuannya begini :

Statement %ROWCOUNT value
FETCH Number of rows returned by the fetched cursor, incremented 1 time for each successful fetch.
SELECT INTO 1, even if TOO_MANY_ROWS is raised
UPDATE Number of rows effected
DELETE Number of rows effected
INSERT Number of rows effected

Hanya harap diingat.
ada pantangannya dalam melakukan jurus ini…
yaitu pengguna jurus wajib menggunakan komputer…… waspadalah!

09
Dec
09

Global Temporary Table

Yup, kali ini gw mau merefresh memori tentang GTT.
Secara umum, karakteristik GTT :
1.Kumpulan data yang kita buat bersifat private, tidak ada gangguan dari luar.
2.Kemudahan menghapus data. Kalau tabel biasa, kita dapat melakukan rollback atau delete. Di GTT, kita dapat men-truncate tabel tanpa takut menhapus data orang lain (session lain).
3.Tidak di-logging
4.Tidak dapat diukur base optimizer (CBO) nya. system tidak mengetahui ada berapa record di tabel.

OK, sekarang gw ingin menghubungkan dalam pemakaian di Oracle Forms.
Katakanlah ada sebuah database datablock DB1 yang diquery menghasilkan puluhan/ratusan ribu record.
Lalu ada sebuah validasi kolom pada saat commit, yakni kolom A yang not null akan terkena proses validasi. Cara yang umum dilakukan adalah me-looping record pada DB1, dan mengecek kolom A tersebut. Tentunya hal ini akan memakan waktu relatif lebih lama dibandingkan dengan GTT. How can?

Caranya adalah dengan meng-create GTT. Lalu kita buat database datablocknya, DB2. Padanannya pada saat query, kita akan melakukan proses insert ke dalam GTT tersebut, dengan acuan execute query pada DB1. Setelah itu, bila user melakukan entry pada kolom A, maka perubahan tersebut sudah tercermin di dalam GTT. Sehingga, pada saat ditekan commit pada Oracle Forms, kita akan melakukan SELECT terhadap GTT yang kolom A nya not null.  Even if, cara ini kelihatannya ribet, tapi akan lebih cepat dalam prosesnya, karena kita hanya akan me-looping record yang sudah terseleksi (WHERE A IS NOT NULL). Setelah itu baru kita lakukan proses INSERT/UPDATE ke tabel DB1.

Cara 1 : DB1 exec query –> User entry –> DB1 For Loop –> Proses Validasi  –> Commit

Cara 2 : DB2 insert based on DB1 exec query –> User entry –> Select DB2 For Loop –> Proses Validasi  –> update/insert ke DB1 –> Commit

19
Nov
09

Upload dan Read File di Forms 10g

Ini adalah potongan code sederhana untuk mengupload dan membaca file teks. Dalam contoh ini digunakan :TXT_DELIMITER untuk pemisah antara nilai kolom satu dan kolom selanjutnya.

/*UTK BROWSE FILE*/
declare
vchfilename	varchar2(100);
begin
vchfilename 	:= CLIENT_GET_FILE_NAME(NULL, NULL, 'TEXT FILES (*.TXT)|*.TXT', NULL, OPEN_FILE);
end;

/*UTK BACA FILE*/
declare
fHandle     	client_text_io.file_type;
vchBuff     	varchar2(1800);
nmbPos		number;  			--ini menandakan letak delimiter.

begin
fHandle 	:= client_text_io.fopen(vchfilename, 'r');
LOOP
Client_Text_IO.Get_Line(fHandle, vchBuff);

nmbPos := instr(vchBuff, :TXT_DELIMITER, 1, 1);
--mencari karakter delimiter dalam vchbuff, dimulai dari karakter pertama, yang pertama kali ditemukan.

:KOLOM_SATU := upper(trim(substr(vchBuff, 1, nmbPos-1)));
--ambil karakter dari karakter pertama sampai pos-1.

vchBuff := substr(vchBuff, nmbPos+1);
--delete karakter pertama s/d pos+1.

:KOLOM_DUA := upper(trim(substr(vchBuff, 1, nmbPos-1)));
--ambil karakter dari karakter pertama sampai pos-1.

vchBuff := substr(vchBuff, nmbPos+1);
--delete karakter pertama s/d pos+1.

dst.

Client_Text_IO.New_Line;
END LOOP;

client_text_io.fclose(fHandle);

exception when others then
client_text_io.fclose(fHandle);
end;
22
Oct
09

Oracle A-List

Ide menarik ini muncul saat saya sedang iseng2 menambahkan RSS feeds, sekadar catch-up dengan berita mancanegara.

Selasa itu, ada entry yang menarik mengenai 25-Highest-Paid-Women-and-Men… dan coba anda tebak? Oracle Corporation masing-masing menempatkan dutanya di urutan 1 untuk wanita berpenghasilan terbesar dan urutan 3 untuk pria berpenghasilan terbesar! Ini salah satu penanda bahwa sekarang memang era industri informasi. Berikut ini profil singkat keduanya (Wikipedia):

Earns Oracle

Lawrence “Larry” Ellison (CEO and Co-founder – ORCL)

Merupakan orang keempat terkaya di dunia versi majalah Forbes. Larry lahir pada tanggal 17 Agustus 1944 (kalo lahirnya di Indo bisa dapet duit dari pemerintah :D), pernah mengecap pendidikan di University of Illinois, dan computer design di University of Chicago, walaupun jenjang pendidikan nya tidak diselesaikan secara penuh. Beliau adalah pendiri Oracle Corporation, yang awal mulanya berangkat dari produk database.

Safra A.Catz (President – ORCL)

Safra lahir di Holon,Israel pada tahun 1961.Ia merupakan lulusan Wharton School (University of Pennsylvania) tahun 1983 dan mendapat predikat Juris Doktor dari University of Pennsylvania Law School. Sebelumnya pernah menjabat Managing Director di Donaldson, Lufkin & Jenrette (bank investasi global), dan direktur non eksekutif pada HSBC Group. Safra memulai karirnya di Oracle pada tahun 1999, dan menjabat CFO/Direktur Keuangan pada tahun 2005.

02
Sep
09

Running Forms Builder di Vista

1. perlu jvm.dll dari java JDK.. MINIMAL versi 6.0
taruh file jvm.dll di \Program Files\Oracle\jinitiator_\bin\hotspot\

bila mau aman, namakan existing jvm.dll menjadi nama lain.. misalnya jvm.dll.bak

2. Start OC4J, buka forms builder…
sebelum buka file, jangan lupa connect dulu ke database… (in case kebiasaan buka file dulu baru konek)

3.good luck




Blog Stats

  • 36,378 hits

RSS World News