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.