Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur

11 Nisan 2014 Cuma

PL/SQL Dosya Okuma ve Yazma

Milyon makale var bu konuda ve Oracle dökümanları dahi yeterken ben de "neler öğrendim" diye bir kenara not alayım istiyorum.

F1, F2 dosyaların işlem yapmamız için uçları
V1 satırları içine okuyacağımız değişkenimiz VARCHAR cinsinden ve maks uzunlukta(32767), Bir karakter uzun olursa istisna fırlatacağı için HER TÜRLÜ İSTİSNA (OTHERS) durumunda çık diyoruz (WHEN OTHERS THEN EXIT;)
declare 
  V1 VARCHAR2(32767); 
  F1 UTL_FILE.FILE_TYPE;
  F2 UTL_FILE.FILE_TYPE;
begin
-- R : Read (Okumak için açıyoruz)
   F1 := UTL_FILE.FOPEN('d:\temp','test.txt','R',256);  
-- W : Write (Yazmak için açıyoruz)
   F2 := UTL_FILE.FOPEN('d:\temp','test1.txt','W',256); 
   LOOP
       BEGIN
            UTL_FILE.GET_LINE(F1, V1, 32767);
            DBMS_OUTPUT.PUT_LINE(V1);
            UTL_FILE.PUT_LINE(F2,V1);
       EXCEPTION
      WHEN OTHERS THEN
        EXIT;
    END;
  END LOOP;
    UTL_FILE.FCLOSE(F1);
    UTL_FILE.FCLOSE(F2);
    dbms_output.put_line('Tüm dosyalar kapandı');
    
end;

Refs: http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_lob.htm#i998315

CLOB Değişkenin dosyaya yazılması.
DECLARE
  dirEFaturalar        varchar2(100)         default 'd:\EFaturalar';
  X_GUID               VARCHAR2(100)         DEFAULT '';
  fileEfatura          UTL_FILE.FILE_TYPE; 
  len_efaturaBuffer    VARCHAR2(32767);
  len_efaturaAmount    BINARY_INTEGER        := 32767;
  len_efaturaCopyPos   INTEGER               := 1;
BEGIN
  X_GUID := UPPER(REGEXP_REPLACE(SYS_GUID(), '(.{8})(.{4})(.{4})(.{4})(.{12})', '\1-\2-\3-\4-\5'));
  fileEfatura := UTL_FILE.FOPEN('d:\EFaturalar', X_GUID || '.txt', 'W', 32767); 
  LOOP
    BEGIN
      DBMS_LOB.read (x_clob, len_efaturaAmount, len_efaturaCopyPos, len_efaturaBuffer);
      UTL_FILE.put(fileEfatura, len_efaturaBuffer);
      len_efaturaCopyPos := len_efaturaCopyPos + len_efaturaAmount;
      EXCEPTION 
        WHEN OTHERS THEN EXIT;      
    END;
  END LOOP; 
  UTL_FILE.FCLOSE(fileEfatura); 
END;