Başlangıç > Forms, Oracle, PL/SQL > oracle forms ile tnsnames.ora parse işlemi.

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.

Reklamlar
  1. Henüz yorum yapılmamış.
  1. No trackbacks yet.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: