Oracle PL/SQL Tutorial/System Packages/File Write with UTL FILE

Материал из SQL эксперт
Перейти к: навигация, поиск

Open the output file for writing

SQL>
SQL> CREATE TABLE myClob
  2  (id NUMBER PRIMARY KEY,
  3   clob_data CLOB);
Table created.
SQL>
SQL> DECLARE
  2    clob_pointer CLOB;
  3    v_Buf VARCHAR2(1000);
  4    Amount BINARY_INTEGER :=1000;
  5    Position INTEGER :=1;
  6    fp UTL_FILE.FILE_TYPE;
  7  BEGIN
  8
  9    insert into myClob values (1,EMPTY_CLOB());
 10
 11    SELECT clob_data INTO clob_pointer FROM myClob WHERE id = 1;
 12
 13    if (DBMS_LOB.ISOPEN(clob_pointer)!=1) then
 14      DBMS_LOB.OPEN (clob_pointer,DBMS_LOB.LOB_READONLY);
 15    end if;
 16
 17    fp :=UTL_FILE.FOPEN("BFILE_DIR","output.dat","w");
 18
 19    LOOP
 20      BEGIN
 21        DBMS_LOB.READ (clob_pointer,Amount,Position,v_Buf);
 22
 23        UTL_FILE.PUT_LINE(fp,v_Buf,TRUE);
 24
 25        Position :=Position +Amount;
 26
 27      EXCEPTION
 28
 29        WHEN NO_DATA_FOUND THEN
 30
 31          EXIT;
 32
 33      END;
 34
 35    END LOOP;
 36
 37    UTL_FILE.FCLOSE(fp);
 38
 39    DBMS_LOB.CLOSE (clob_pointer);
 40  END;
 41  /

SQL>
SQL> drop table myClob;
Table dropped.


Save lines to a file

SQL>
SQL> CREATE OR REPLACE PROCEDURE put_line
  2     (file_in IN UTL_FILE.FILE_TYPE,
  3      line_in IN VARCHAR2,
  4      
  5      max_line_size_in IN INTEGER := 1023)
  6  IS
  7     v_line VARCHAR2(32767);
  8     v_linelen CONSTANT INTEGER := LENGTH (line);
  9     v_start INTEGER := 1;
 10     v_max CONSTANT INTEGER := max_line_size_in - 1;
 11  BEGIN
 12     LOOP
 13        EXIT WHEN v_start > v_linelen OR v_linelen IS NULL;
 14        v_line := SUBSTR (line_in, v_start, v_max);
 15        IF v_start + v_max < v_linelen
 16        THEN
 17           v_line := v_line || "-";
 18        END IF;
 19        UTL_FILE.PUT_LINE (file_in, v_line);
 20        v_start := v_start + v_max;
 21     END LOOP;
 22  END;
 23  /


Save string to a file with UTL_FILE.PUTF

SQL>
SQL> CREATE OR REPLACE PROCEDURE saveStringToFile(fid IN UTL_FILE.FILE_TYPE,it_is IN VARCHAR2)
  2  IS
  3  BEGIN
  4     UTL_FILE.PUTF (fid, "string",it_is);
  5  END;
  6  /

SQL>
SQL>


Write text to a file with UTL_FILE package

SQL>
SQL> DECLARE
  2     fid UTL_FILE.FILE_TYPE;
  3     f VARCHAR(200);
  4     v VARCHAR2(32767);
  5     topdir VARCHAR2(100);
  6
  7     PROCEDURE recNgo (str IN VARCHAR2)
  8     IS
  9     BEGIN
 10        DBMS_OUTPUT.PUT_LINE ("UTL_FILE error " || str || " in " || f);
 11        UTL_FILE.FCLOSE (fid);
 12     END;
 13
 14     PROCEDURE writeit
 15     IS
 16     BEGIN
 17         f := "c:\a";
 18         fid := UTL_FILE.FOPEN (f, "temp.txt", "W");
 19         UTL_FILE.PUT_LINE (fid, v);
 20         UTL_FILE.FCLOSE (fid);
 21        DBMS_OUTPUT.PUT_LINE ("Successful write to " || f);
 22      EXCEPTION
 23         WHEN UTL_FILE.INVALID_PATH THEN recNgo ("invalid_path");
 24         WHEN UTL_FILE.INVALID_MODE THEN recNgo ("invalid_mode");
 25         WHEN UTL_FILE.INVALID_FILEHANDLE THEN recNgo ("invalid_filehandle");
 26         WHEN UTL_FILE.INVALID_OPERATION THEN recNgo ("invalid_operation");
 27         WHEN UTL_FILE.READ_ERROR THEN recNgo ("read_error");
 28         WHEN UTL_FILE.WRITE_ERROR THEN recNgo ("write_error");
 29         WHEN UTL_FILE.INTERNAL_ERROR THEN recNgo ("internal_error");
 30     END;
 31  BEGIN
 32     writeit;
 33  END;
 34  /

SQL>