oracle forms ile tnsnames.ora parse işlemi.
Merhaba
Çoğu zaman uygulama geliştirirken bir database ihtiyacımız olur. Bu database bazen bir Notepad , Access ya da Mysql vb. bazende daha Oracle gibi bir database olur.
Database bağlantılı hazırladığımız uygulamalar her zaman sabit bir db ye bağlanmak zorunda değildir. Uygulama ihtiyacına ya da çalışma durumuna göre farklı db erişimi yapmak zorunda olabilir. Bu gibi durumlar için son kullanıcının işlem yapacağı db seçimini kolaylaştırmak için bir parser yardımı ile hazırlanan db listesi işimizi görür.
Ben şuan evde Oracle 10g XE database kullanıyorum ve örneğimi bu db üzerinden vereceğim.Bilindiği gibi Oracle db erişim bilgilerini “tnsnames.ora” dosyasında tutar ve burada belirtilen database/lere bağlantı kurar.
Üzerinde çalışma yaptığım iki farklı db bulunduğu için bu parse işlemi hazırladığım uygulamalarda da bana çok kolaylık sağladı umarım sizin içinde faydalı olur.
Artık parse işlemine ve örnek kodlarımıza bakalım.Öncelikle “tnsnames.ora” dosyası içindeki db bilgilerini parse edecek ve bize sadece db bilgilerini verecek olan fonksiyonumuzu hazırlayalım.
CREATE OR REPLACE FUNCTION tns_listesi(tns VARCHAR2) RETURN VARCHAR2 IS tns_liste VARCHAR2(32000); BEGIN tns_liste := tns; tns_liste := REPLACE(tns_liste, chr(10), NULL); tns_liste := regexp_replace(tns_liste, '\)([[:alnum:]])', chr(10) || '\1'); tns_liste := regexp_replace(tns_liste, '=.*\)', NULL); tns_liste := REPLACE(REPLACE(tns_liste, chr(10), ','), chr(32), NULL); RETURN(tns_liste); END tns_listesi;
Hazırladığımız bu fonksiyon “tnsnames.ora” dosyası içindeki tüm bilgileri string olarak alıp parse işlemini yapıyor. Örnek olarak fonksiyonu uygulama içinde kullanmadan önce bir declare ile test işlemimizi yapalım. Sistemimizde “DB_1″ , “DB_2″ , “DB_3″ şeklinde üç adet db olduğunu varsayalım ve doğru parse işleminin olup olmadığını kontrol edelim.
DECLARE
tns VARCHAR2(4000);
BEGIN
tns := '
DB_1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =10.0.0.10)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE)
)
)
DB_2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.20)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE)
)
)
DB_3 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.30)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE)
)
)
';
dbms_output.put_line(tns_listesi(tns));
END;
Örnek declare komutumuzu çalıştırdığımızda ise dbms_output ile çıktıyı görebiliriz. Çıktı sonucu olarak ise bize aşağıdaki sonuç gelecektir.
DB_1,DB_2,DB_3
Ben bir sonraki işlemde kullanım için db isimlerini “,” ile ayırdım. Bu işlemi siz istediğiniz şekilde değiştirebilirsiniz. Şimdi Oracle Forms uygulaması içinde bir prosedür oluşturup parse işlemimizi uygulamamıza dahil edelim.
PROCEDURE db_listele IS
i NUMBER;
tnsstr VARCHAR2(4000);
tns VARCHAR2(100);
text_file text_io.file_type;
text_buffer VARCHAR2(32000);
text_buffer2 VARCHAR2(32000);
uzun NUMBER;
BEGIN
i := 1;
clear_list('BLOCK_TNS.TNS_LIST');
text_file := text_io.fopen('C:\ORACLEXE\APP\ORACLE\PRODUCT\10.2.0\SERVER\NETWORK\ADMIN\TNSNAMES.ORA', 'r');
BEGIN
LOOP
text_io.get_line(text_file, text_buffer);
text_buffer2 := text_buffer2 || text_buffer || chr(10);
END LOOP;
EXCEPTION
WHEN no_data_found THEN
NULL;
END;
tnsstr := tns_listesi(text_buffer2);
WHILE instr(tnsstr, ',') > 0 LOOP
tns := substr(tnsstr, 1, instr(tnsstr, ',') - 1);
tnsstr := substr(tnsstr, instr(tnsstr, ',') + 1, 2048);
add_list_element('BLOCK_TNS.TNS_LIST', i, tns, tns);
i := i + 1;
END LOOP;
END;
Yazdığımız prosedür içini inceleyecek olursak öncelikle db nin kurulu olduğu lokasyondan “tnsnames.ora” içindeki metini okuyup bir değişkene attıktan sonra bu değeri parse işlemi için yazdığımız fonksiyona gönderiyoruz. Parse işleminden sonra bize gelen db isimlerini ise sırası ile gezerek ve ayrıştırma işlemi için kullandığmız “,” yardımı ile her db ismini ayrı ayrı uygulamamızda bulunan “TNS_LIST” nesnesi içine ekliyoruz.
Artık bu işlemden sonra sistemde bulunan tüm db adlarını elde ettiğimize göre uygulamız üzerinde son kullanıcı ve hatta kendimiz için bu seçimi kullanarak istediğimiz db için bağalntı işlemi oluşturabiliriz.
Kolay gelsin.




