2016-04-04 4 views
0

У меня есть анонимный блок, который извлекает все процедуры для базы данных, а затем записывает каждую процедуру в файл.Запросы на извлечение PLSQL oracle 9i

Он отлично работает, когда я использую utl_file.put_line (кроме того, что для каждой строки и пространства между каждой линией) Если я использую utl_file.put процедура не является неполной без исключения

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

 Смежные вопросы

  • Нет связанных вопросов^_^