Tabloların csv formatında dışarı aktarılması
Veritabanındaki tablolardaki verileri , belirli bir koşula bağlı olarak csv formatında dışarı aktarmak mümkündür. Bu işlem için UTL_FILE paketini kullanabiliriz.
Aşağıdaki prosedür ile bir tablodaki verileri koşul belirterek yada belirtmeyerek , sanal dizin ile belirteceğimiz sunucudaki bir dizine csv formatlı dosya oluşturabiliriz.
Prosedürde kolon isimlerini ayırmak için “|” , kolonları ayırmak için “|” , satırları ayırmak için “`” işaretleri kullanılmaktadır. l_separator değişkeni ile dilediğiniz ayracı kullanabilirsiniz.
CREATE OR REPLACE PROCEDURE SYS.dump_table_to_csv (p_tname IN VARCHAR2,
p_dir IN VARCHAR2,
p_filename IN VARCHAR2,
p_condition IN VARCHAR2)
IS
l_output UTL_FILE.file_type;
l_theCursor INTEGER DEFAULT DBMS_SQL.open_cursor;
l_columnValue VARCHAR2 (4000);
l_status INTEGER;
l_query VARCHAR2 (1000) DEFAULT 'select /*+ PARALLEL 16*/ * from ' || p_tname || ' ' || p_condition;
l_colCnt NUMBER := 0;
l_separator VARCHAR2 (1);
line_separator VARCHAR2 (1);
l_descTbl DBMS_SQL.desc_tab;
BEGIN
l_output := UTL_FILE.fopen_nchar (p_dir, p_filename, 'w');
EXECUTE IMMEDIATE
'alter session set nls_date_format=''dd-mon-yyyy hh24:mi:ss'' ';
DBMS_SQL.parse (l_theCursor, l_query, DBMS_SQL.native);
DBMS_SQL.describe_columns (l_theCursor, l_colCnt, l_descTbl);
line_separator := '`';
FOR i IN 1 .. l_colCnt
LOOP
UTL_FILE.put_nchar (l_output,
l_separator || l_descTbl (i).col_name);
DBMS_SQL.define_column (l_theCursor,
i,
l_columnValue,
4000);
l_separator := '|';
END LOOP;
UTL_FILE.put_nchar (l_output,
line_separator );
UTL_FILE.new_line (l_output);
l_status := DBMS_SQL.execute (l_theCursor);
WHILE (DBMS_SQL.fetch_rows (l_theCursor) > 0)
LOOP
l_separator := '';
FOR i IN 1 .. l_colCnt
LOOP
DBMS_SQL.COLUMN_VALUE (l_theCursor, i, l_columnValue);
UTL_FILE.put_nchar (l_output, l_separator || l_columnValue );
l_separator := '|';
END LOOP;
UTL_FILE.put_nchar (l_output,
line_separator );
UTL_FILE.new_line (l_output);
END LOOP;
DBMS_SQL.close_cursor (l_theCursor);
UTL_FILE.fclose (l_output);
EXECUTE IMMEDIATE 'alter session set nls_date_format=''dd-MON-yy'' ';
EXCEPTION
WHEN OTHERS
THEN
EXECUTE IMMEDIATE 'alter session set nls_date_format=''dd-MON-yy'' ';
RAISE;
END;
/
Prosedür kullanımı :
İlk önce aşağıdaki gibi sanal dizin oluşturulması gerekmektedir. Örnek olarak /tmp dizinini gösteren CSV_DUMP_DIR isimli sanal dizin oluşturulmaktadır.
CREATE OR REPLACE DIRECTORY CSV_DUMP_DIR AS '/tmp';
Oluşturulan sanal dizine prosedürü çalıştıracak kullanıcı için okuma ve yazma yetkisi verilmelidir.
GRANT READ, WRITE ON DIRECTORY CSV_DUMP_DIR TO USERNAME;
Aşağıdaki gibi prosedürü çalıştırabiliriz. Koşul belirtirken tırnak işaretlerinin çift yazılması gerekmektedir. Koşul belirtmeyecek isek p_condition parametresi boş gönderilebilir. Prosedürü çalıştıracak kullanıcının , dışarı aktarmaya çalıştığı tabloda sorgulama yapabilmesi gerekmektedir.
Koşullu :
SQL> exec dump_table_to_csv( 'KULLANICI.TABLO', 'CSV_DUMP_DIR', 'TABLO.CSV','where to_char(TARIH,''yyyy'')=''2017'''); PL/SQL procedure successfully completed.
Koşulsuz :
SQL> exec dump_table_to_csv( 'KULLANICI.TABLO', 'CSV_DUMP_DIR', 'TABLO.CSV',''); PL/SQL procedure successfully completed.
Elinize sağlık güzel bir makale olmuş.