Tabloların csv formatında dışarı aktarılması

5 Oca by Ahmet Duruöz

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.

Loading

One Comments “Tabloların csv formatında dışarı aktarılması

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir