Çarşamba , 6 Ağustos 2014
Son Haberler
Anasayfa / MAKALELER / Veri Tabanı / EXTERNAL TABLE – 2

EXTERNAL TABLE – 2

External Table ile ilgili Bir Senaryo

Merhaba,
Önceki makalemizde External Table konusuna giriş yapmış ve nasıl kullanacağımızdan bahsetmiştik.Şimdi biraz daha farklı bir senaryo kuralım:
Tablomuzu create ettiğimizi varsayalım. Ve directory de birden fazla csv olduğunu düşünelim. Burada aslında zor olan taraf her csv(kaynak file) için create scriptini baştan oluşturmamızdır. Her biri için kolonları tekrar düzenlemek bizi zaman açısından zorlayabilir. Biz sadece tabloları create edelim ve bir procedur yazalım. Bu procedur de çalıştırıldığında belirlediğimiz parametreye gore o anki tablo için csv yi kendisi bulsun ve bu scripti bizim için oluştursun. Hatta çalıştırsın..:)
CREATE OR REPLACE PROCEDURE tabloyu_create(p_tab_name IN VARCHAR2)
IS
   CURSOR c1
   IS
      SELECT  *
        FROM dba_tab_columns
       WHERE table_name=p_tab_name
             AND column_name NOT IN
                    (‘INSERT_TIMESTAMP’,'LAST_UPDATE_TIMESTAMP’);
   i           NUMBER:=0;
   v_cols      VARCHAR2(4000):=”;
   v_fields    VARCHAR2(4000):=”;
   v_cr_lf     VARCHAR2(100):=CHR(10);                     – || CHR (13);
   v_sql       VARCHAR2(4000);
   v_type      VARCHAR2(100);
   v_ref_col   VARCHAR2(100);
BEGIN
        FOR  rw  IN  c1
             LOOP
               –      t_col (i) := rw.column_name;
                 /* if rw.data_type = ‘NVARCHAR2′ then
               v_type := ‘VARCHAR2(1000)’;
                 else
                       v_type := rw.data_type;
                 end if;*/
      IF rw.data_type LIKE ’%TIMESTAMP%’ OR rw.data_type LIKE ’%DATE%’
      THEN
         v_type:=rw.data_type;
         v_fields:=
            v_fields || ’”‘ || rw.column_name || ’”‘
            || ’ char(50) date_format TIMESTAMP mask ”MM/DD/YYYY HH24:MI:SS” ‘
            || ’,’
            || v_cr_lf;
      ELSE
         v_type:=rw.data_type || ’ ‘ || ’(‘ || rw.DATA_LENGTH || ’)';
         v_fields:=v_fields || ’”‘ || rw.column_name || ’”,’ || v_cr_lf;
      END IF;
      –v_fields := v_fields || ‘”‘ || rw.column_name || ‘”,’ || v_cr_lf;
      v_cols:=v_cols || rw.column_name || ’ ‘ || v_type || ’,' || v_cr_lf;
   END LOOP;
   v_sql:=
         ’CREATE TABLE tmp_’
      || p_tab_name
      || ’ (‘
      || RTRIM(v_cols,v_cr_lf || ’,')
      || ’)’
      || ’ORGANIZATION EXTERNAL
          (  TYPE ORACLE_LOADER
             DEFAULT DIRECTORY DIR_AG
             ACCESS PARAMETERS
               ( RECORDS DELIMITED BY NEWLINE
                SKIP 1
                BADFILE ”bad_%a_%p.bad”
                LOGFILE ”log_%a_%p.log”
                FIELDS TERMINATED BY ”,”
                optionally enclosed by ”””
                MISSING FIELD VALUES ARE NULL
                REJECT ROWS WITH ALL NULL FIELDS
                (‘
      || RTRIM(v_fields,v_cr_lf || ’,')
      || ’)
                  )
             LOCATION (DIR_AG:’
      || ””
      || p_tab_name
      || ’.csv’
      || ””
      || ’)
          )
        REJECT LIMIT UNLIMITED
        PARALLEL ( DEGREE 8 INSTANCES 1 )
        NOMONITORING’;
   DBMS_OUTPUT.put_line(v_sql);
–execute immediate v_sql;  
END;
/* çalışırırken dikkat edilmesi gereken nokta -tablo adını ya da csv ismini diyebiliriz- çünkü mantık olarak aynı olacak ve bu procedurumuz başına ‘tmp_’ ekleyerek bize scripti verecek-
büyük küçük harf hassasiyeti var. ve çalıştırmak için *****/
EXEC  sys.tabloyu_create(‘KISI_DENEME’);   /*  Burda ismini verdiğimiz tablonun Databaseimizde             önceden yaratılması gerektiğini ve csv file adı ile aynı olması gerektiğini unutmamalıyız.****/
/* cümlesini kullanıyoruz. daha sonra dbms_output dan scriptimizi alarak tablomuzu oluşturabilir.****/
 
Teşekkürler.

Hakkında Mustafa Aksoy

Sakarya Üniversitesi Bilgisayar Mühendisliği mezunuyum. DWH/ETL ve Microstrategy Developer olarak çalışma hayatıma devam etmekteyim. İlgi alanlarım ve bildiğim teknolojiler; PL/SQL, ODI, ETL Circle, Data Guard,Reporting,Microstrategy ve Talend(ETL Tool)

Cevapla

E-posta adresiniz yayınlanmayacak. Required fields are marked *

*


Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>