create or replace procedure sp_expsp(owner varchar2,O_FLG OUT varchar2,o_line out varchar2,o_text out varchar2)
is
type user_source_table_type is table of user_source.text%TYPE INDEX BY BINARY_INTEGER;
user_source_table user_source_table_type;
file_handle utl_file.file_type;
stor_text VARCHAR2(4000);
sql_stat varchar2(1000);
sql_stat2 varchar2(1000);
sql_stat3 varchar2(1000);
nCount NUMBER;
i NUMBER;
S_PROG_ST VARCHAR(300); --定义程序异常描述
S_SQLCODE VARCHAR(20); --程序执行SQLCODE
S_POINT VARCHAR(30); --程序执行检查点
errname varchar2(80);
i_tx_dt varchar2(8);
begin
i_tx_dt := to_char(sysdate-1,'yyyymmdd');
sql_stat:='select distinct(name) from all_source where owner = ''' || upper(owner) || '''';
execute immediate sql_stat bulk collect into user_source_table;
for j in 1..user_source_table.count loop
i:=1;
errname := user_source_table(j);
file_handle:=utl_file.fopen('DIR_DATATXT',errname||i_tx_dt||'.sql','W');
sql_stat2:='SELECT MAX(LINE) FROM ALL_SOURCE WHERE OWNER=''' || upper(owner) || ''' AND NAME=''' || user_source_table(j) || '''';
execute immediate sql_stat2 into nCount;
WHILE i<=nCount LOOP
sql_stat3:='SELECT TEXT FROM ALL_SOURCE WHERE OWNER=''' || upper(owner) || ''' AND NAME=''' || user_source_table(j) || ''' and line = ' || i;
execute immediate sql_stat3 into stor_text;
i:=i+1;
utl_file.put(file_handle,stor_text);
if(i mod 100 = 0) then
utl_file.fflush(file_handle);
end if;
END LOOP;
utl_file.fflush(file_handle);
utl_file.fclose(file_handle);
end loop;
commit;
EXCEPTION -- exception handlers begin
WHEN OTHERS THEN -- handles all other errors
S_SQLCODE := TO_CHAR(SQLCODE);
S_PROG_ST := sqlerrm ;
O_FLG := errname;
o_line := i;
o_text := stor_text;
ROLLBACK;
WRITE_LOG(sysdate,'1','SP_EXPSP','E',S_SQLCODE,S_PROG_ST);
COMMIT;
end sp_expsp;
1.大部分程序是copy别人的;
2.在程序运行中,老是报错 sys.utl_file.put 字符串超长.这个是系统已经定义的一个package,我们没有办法修改.上网查了下,可以用循环处理字符串的方法写入文件.我的解决办法是缓存100行后,写入文件中。
3.每一个存储过程、函数等,我单独建立了一个文件,并标示了日期。其实,应该先判断下文件是否存在,我没有找到好的办法,呵呵。
4.在运行本程序前需要
CREATE [OR REPLACE] DIRECTORY directory AS 'pathname';
create or replace directoryDIR_DATATXT as ‘d:/oraclebak’;
目录创建以后,就可以把读写权限授予特定用户,具体语法如下:
GRANT READ[,WRITE] ON DIRECTORY directory TOusername;
例如:
grant read, write on directoryDIR_DATATXT to eygle;
5.更好一点办法是,在程序里DIR_DATATXT 下新建一个目录,把文件放到目录里。这样就需要涉及到授权,并且自身不能给自身授权,只能通过sys、sysdba或者其他具有sys权限的用户授权。需要在存储过程中执行类似 linux的su 命令。木有搞定.............