在oracle10g 下,导出用户存储过程、视图、函数等

时间:2022-08-18 15:28:28

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 命令。木有搞定.............