2016-04-04 21 views
0

データベースのすべてのプロシージャを抽出し、各プロシージャをファイルに書き込む匿名ブロックがあります。PLSQL extract procudures oracle 9i

私は utl_file.put手順を使用している場合は、私が(その各ラインのためのものであり、各ラインの間のスペースを除く)utl_file.put_line を使用するときには、正常に動作が不完全は例外

/* 
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; 

ません私はスペースを除いてputとput_lineの間に何の違いもありません。

答えて

1

UTL_FILE.PUT_LINEは物理ファイルに出力をフラッシュします。 UTL_FILE.PUTは表示されません。 PUTを使用する場合は、ファイルを手動でフラッシュする必要があります。したがって、fFile.PUT_LINE('whatever');fFile.PUT('whatever'); fFile.FFLUSH;に置き換えてください。

幸運のベスト。

+0

正解私はちょうどfFile.FFLUSH(ファイル)を追加する必要があります非常に有用だった – jimra