Thursday, December 09, 2004

Mensetting parameter NLS_XXX

Setting parameter NLS_

NLS_LANG parameter digunakan untuk mengatur general format dari database, seperti format tanggal, waktu, bahasa atau karakter yg digunakan, format mata uang (currency setting), kalender yg digunakan dan lain sebagainya. Yang harus di ingat adalah konfigurasi yg berlaku pada database Oracle tidak ada hubungannya dengan regional setting dari komputer yg digunakan.

Lalu hal apa yg menyebabkan pentingnya pembahasan mengenai konfigurasi format database Oracle?.

Apakah anda pernah mencoba proses insert atau update dan menemukan pesan kesalahan seperti yang terlihat pada contoh dibawah?

SQL> connect indooracle/dba@indooracle_db
Connected.
SQL> select sysdate from dual;

SYSDATE
-----------
21-SEP-2001

SQL> insert into table_contoh values ('12/12/99')

ERROR at line 1:
ORA-01843: not a valid month
Kejadian ini mungkin jarang dialami untuk anda-anda yg membangun suatu aplikasi yg tidak memperhitungkan lintas regional. Dan akan mengalaminya jika anda membangun aplikasi yg ditujukan untuk beberapa perusahaan yg berada di teority/negara yg berbeda.

sebelum lebih jauh marilah kita melihat hirarki dari NLS_ parameter.
  1. Database
  2. Instance ( berasal dari setting init.ora )
  3. Clint Side (berasal dari client environment atau setting registry )
  4. Session ( via perintah ALTER SESSION )
Lebih detail marilah kita membicarakan masing-masing tingkatan tersebut;

Parameter NLS_ pada Database

Configurasi parameter ini di tentukan dari variable environment NLS_TERRITORY pada saat pembuatan database. Dimana NLS_TERRITORY itu sendiri di turunkan dari parameter NLS_LANGUAGE. untuk AMERICA format tanggalnya adalah DD-MON-YY.

Parameter NLS_ pada Instance

Setting parameter ini ditentukan pada sebuah init.ora file, untuk mengetahui NLS yg terdapat pada init.ora melalui SQL*Plus yaitu dengan melihat melalui view NLS_INSTANCE_PARAMETERS.
SQL> select * from nls_instance_parameters;

PARAMETER VALUE
------------------------------ -------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_SORT
NLS_DATE_LANGUAGE
NLS_DATE_FORMAT
NLS_CURRENCY
NLS_NUMERIC_CHARACTERS
NLS_ISO_CURRENCY
NLS_CALENDAR
NLS_TIME_FORMAT
NLS_TIMESTAMP_FORMAT
NLS_TIME_TZ_FORMAT
NLS_TIMESTAMP_TZ_FORMAT
NLS_DUAL_CURRENCY
NLS_COMP

NLS_ pada configurasi Client

NSL parameter pada client ditentukan dalam registry dalam key HKEY_LOCAL_MACHINE\Software\Oracle (untuk aplikasi 32 Bit), sedangkan untuk aplikasi 16 Bit, setting NLS ditentukan pada oracle.ini. Yang harus diingat
adalah setting yg sebelumnya sudah didefiniskan pada Database atau Instance
akan secara otomatis ditimpa.

pada saat instalasi PC default NLS adalah NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1 >> DD-MON-YY

Setting NLS instance pada init.ora ini hanya akan dipakai jika setting NLS_LANG dan NLS_DATE_FORMAT pada client tidak digunakan.

NLS_DATE_FORMAT dengan menggunakan SESSION

Untuk menimpa setting dari NLS parameter yg ada pada Database, instance
atau pun client, yaitu dengan menggunakan perintah ALTER SESSION secara
explicit.

SQL> alter session set nls_date_format='DD-MON-YYYY HH24:MI:SS';

dengan memanfaatkan NLS_SESSION_PARAMETERS kita dapat menampilkan effeknya yaitu kombinasi NLS setting dari Database, instancem, client dan session.
SQL> select * from nls_session_parameters;
PARAMETER VALUE
------------------------------ ------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-YYYY HH24:MI:SS
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-YY HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZH:TZM
NLS_TIMESTAMP_TZ_FORMAT DD-MON-YY HH.MI.SSXFF AM TZH:T
NLS_DUAL_CURRENCY $
NLS_COMP

15 rows selected.

Menghindari masalah perbedaan setting NLS

Dari penjelasan di atas dapat disimpulkan, bahwa proses pada aplikasi yang
berjalan akan tergantung pada setting NLS. Maka muncul sebuah pertanyaan:
bagaimana untuk menghindari perbedaan setting NLS ini?.
insert into table_name values
( TO_DATE( sDay||'-'||sMonth||'-'||sYear,'DD-MM-YYYY') );
* Di assumsikan sDay, sMonth dan sYear masing-masing berisi:
'12' --> tanggal
'12' --> Bulan
'2001' --> Tahun

Kesimpulan

Jika kita menemukan setting NLS (misalkan NLS_DATE_FORMAT) pada
init.ora tidak berfungsi, maka yg dapat dilakukan adalah mengganti setting pada
registry yang berada pada

HKEY_LOCAL_MACHINE\Software\Oracle

atau, dengan menggunakan perintah ALTER SESSION,

SQL> alter session set nls_date_format='DD-MON-YYYY HH24:MI:SS';atau jika anda menggunakan Oracle 8i, release 8.1
create or replace trigger data_logon_trigger
after logon
ON DATABASE
begin
execute immediate
'alter session set nls_date_format = ''yyyymmdd'' ';
end;
/
Ok!... sekian saja...

0 Comments:

Post a Comment

<< Home