PLSQL 提取程序 oracle 9i
PLSQL extract procudures oracle 9i
我有一个匿名块,它提取数据库的所有过程,然后将每个过程写入一个文件。
当我使用 utl_file.put_line 时它工作正常(除了每行是和每行之间的 space)
如果我用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;
除了 space
之外,我没有发现 put 和 put_line 之间的任何区别
UTL_FILE.PUT_LINE
会将输出刷新到物理文件。 UTL_FILE.PUT
不会。
如果要使用 PUT
则需要手动刷新文件;因此,将 fFile.PUT_LINE('whatever');
替换为 fFile.PUT('whatever'); fFile.FFLUSH;
.
祝你好运。
我有一个匿名块,它提取数据库的所有过程,然后将每个过程写入一个文件。
当我使用 utl_file.put_line 时它工作正常(除了每行是和每行之间的 space) 如果我用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;
除了 space
之外,我没有发现 put 和 put_line 之间的任何区别UTL_FILE.PUT_LINE
会将输出刷新到物理文件。 UTL_FILE.PUT
不会。
如果要使用 PUT
则需要手动刷新文件;因此,将 fFile.PUT_LINE('whatever');
替换为 fFile.PUT('whatever'); fFile.FFLUSH;
.
祝你好运。