2016-04-04 14 views
0

Ich habe einen anonymen Block, der alle Prozeduren für eine Datenbank extrahiert und dann jede Prozedur in eine Datei schreibt.PLSQL-Extrakt procudures oracle 9i

es funktioniert, wenn ich utl_file.put_line verwenden (außer, dass für jede Zeile und Abstand zwischen den Zeilen) Wenn ich utl_file.put die Verfahren sind unvollständig keine Ausnahmen

/* 
create or replace directory plsql_path as '/u020/apps/klainet/plsql'; 
grant ALL on directory plsql_path to public; 
select * from dba_directories;*/ 


DECLARE 
tmp_name VARCHAR2(255) :='PROCEDURE'; 
v_path VARCHAR2(100) := '/u020/apps/klainet/plsql'; 
v_File_name VARCHAR2(100); 
v_file UTL_FILE.FILE_TYPE; 
v_flag BOOLEAN := FALSE; 
str_len NUMBER; 
loop_count NUMBER; 
BEGIN 
    FOR line IN (SELECT * FROM all_source WHERE OWNER NOT IN('SYS','SYSTEM') ORDER BY OWNER, TYPE,NAME, LINE) LOOP 
    IF tmp_name <> line.NAME THEN 

     IF v_flag = TRUE THEN 
     BEGIN 
      UTL_FILE.FCLOSE(v_file); 
     EXCEPTION 
      WHEN OTHERS THEN 
      DBMS_OUTPUT.PUT_LINE('error al escribir la linea '|| line.owner ||' ' || line.name); 
     END; 

     END IF; 

     tmp_name := line.NAME; 
     v_File_name := line.owner||'.'||line.NAME||'.sql'; 
     --dbms_output.put_line(v_file_name); 
     BEGIN 
     v_file := UTL_FILE.FOPEN ('PLSQL_PATH', v_File_name, 'w'); 
     v_File_name:=''; 
     EXCEPTION 
     WHEN OTHERS THEN 
      DBMS_OUTPUT.PUT_LINE('No se pudo crear el archivo de salida ' || v_File_name); 
     END; 
     v_flag := TRUE; 
    END IF; 
    BEGIN 
     --UTL_FILE.PUT(v_file, line.text); 
     str_len := LENGTH(line.text); 
     loop_count := 0; 
     WHILE loop_count < str_len 
     LOOP 
     SYS.utl_file.put_line(v_file, substr(line.text, loop_count +1, 255)); 
     loop_count := loop_count +255; 
     END LOOP; 
    EXCEPTION 
     WHEN OTHERS THEN 
     loop_count :=0; 
     DBMS_OUTPUT.PUT_LINE('error al escribir la linea '|| line.owner ||' ' || line.name); 
    END; 

    END LOOP; 
END; 

Ich gebe keinen Unterschied zwischen put und put_line, außer der Raum

Antwort

1

UTL_FILE.PUT_LINE wird Ausgabe in die physische Datei zu flush. UTL_FILE.PUT wird nicht. Wenn Sie PUT verwenden möchten, müssen Sie die Datei manuell leeren. Ersetzen Sie daher fFile.PUT_LINE('whatever'); durch fFile.PUT('whatever'); fFile.FFLUSH;.

Viel Glück.

+0

Richtige Antwort es war sehr hilfreich ich muss nur hinzufügen fFile.FFLUSH (Datei) – jimra

Verwandte Themen