zoukankan      html  css  js  c++  java
  • Oracle数据库自动备份SQL文本:Procedure存储过程,View视图,Function函数,Trigger触发器,Sequence序列号等

    功能:备份存储过程,视图,函数触发器,Sequence序列号等
    准备工作:
    --1.创建文件夹 :'E:/OracleBackUp/ProcBack';--文本存放的路径
    --2.执行:create or replace directory MyProcBakPath as 'E:/OracleBackUp/ProcBack';
    --3.赋权限:
    sqlplus /nolog
    conn user/pswd as sysdba
    grant select on DBA_OBJECTS to user;
    --4.创建Job,自动执行,自动备份存储过程
    +缩减代码,归类循环执行 lzpong 2015/03/18
    +更改代码,使大存储过程也能保存,并且 不会出现 "用户名"."对象名" 的格式 lzpong 2015/07/14
    +更改类型定义 为 long 字段类型表,使能保存大视图; 保存视图名到创建语句中 lzp 2016/05/06

    +?触发器依然会有用户名的前缀?

    以下是本人历经多次修改的最终Sql代码:

     1 CREATE OR REPLACE PROCEDURE OBJAUTOSTORE
     2 AS
     3 /* 功能:备份存储过程和视图
     4 准备工作:
     5 --1.创建文件夹 :'E:/OracleBackUp/ProcBack';--文本存放的路径
     6 --2.执行:create or replace directory MyProcBakPath as 'E:/OracleBackUp/ProcBack';
     7 --3.赋权限:
     8 sqlplus /nolog
     9 conn nag/nag as sysdba
    10 grant select on DBA_OBJECTS to NAG;
    11 --4.创建Job,自动执行,自动备份存储过程
    12 +缩减代码,归类循环执行 lzpong 2015/03/18
    13 +更改代码,使大存储过程也能保存,并且 不会出现 "用户名"."对象名" 的格式  lzpong 2015/07/14
    14 +更改类型定义 为 long 字段类型表,使能保存大视图; 保存视图名到创建语句中  lzp 2016/05/06
    15 */
    16 OutFile   UTL_FILE.FILE_TYPE;
    17 --type user_source_table_type is table of user_source.text%TYPE INDEX BY BINARY_INTEGER;
    18 type user_source_table_type is table of long INDEX BY BINARY_INTEGER;
    19 user_source_table user_source_table_type;
    20 
    21 pos INTEGER;
    22 line integer;
    23 towner VARCHAR2(50) :='NAG';
    24 
    25 cursor abc is
    26   SELECT 'PROCEDURE' otype,'Proc_'||to_char(sysdate, 'yyyymmddhh24miss')||'.sql' ofile FROM DUAL
    27 union all SELECT 'VIEW' ,'View_'||to_char(sysdate, 'yyyymmddhh24miss')||'.sql'  FROM DUAL
    28 union all SELECT 'TRIGGER' , 'Trig_'||to_char(sysdate, 'yyyymmddhh24miss')||'.sql'  FROM DUAL
    29 union all SELECT 'SEQUENCE' , 'Sequ_'||to_char(sysdate, 'yyyymmddhh24miss')||'.sql'  FROM DUAL
    30 union all SELECT 'FUNCTION' , 'Func_'||to_char(sysdate, 'yyyymmddhh24miss')||'.sql'  FROM DUAL
    31 ;
    32 BEGIN
    33 
    34 for rec in abc loop
    35 dbms_output.put_line(rec.otype||','||rec.ofile);
    36   OutFile:=UTL_FILE.FOPEN('MYPROCBAKPATH' , rec.ofile,'w',32767);
    37   --for robj in (select owner,object_name from user_objects where object_type=rec.otype) loop --使用当前用户的
    38     for robj in (select owner,object_name from dba_objects /*user_objects*/ where object_type=rec.otype and owner=towner) loop
    39         --select dbms_metadata.get_ddl(rec.otype,robj.object_name,towner) into v_sql from dual;
    40         UTL_FILE.put_line(OutFile,'-----------------start '||robj.object_name||')----------------');
    41         pos:=1;
    42         line:=1;
    43         --大对象写入文件
    44         UTL_FILE.put(OutFile,'create or replace ');
    45     if(rec.otype='VIEW')then
    46           UTL_FILE.put(OutFile,'view '||robj.object_name||chr(10));
    47           execute immediate 'select text from user_views where view_name='''||robj.object_name||'''' bulk collect into user_source_table;
    48     elsif(rec.otype='SEQUENCE')then
    49           execute immediate 'select ''create sequnence ''||sequence_name||'' min_value ''||min_value||'' max_value ''||max_value||'' increment by ''||increment_by||'' start with ''||last_number||(case when cycle_flag=''Y'' then '' cycle '' else '''' end)||(case when order_flag=''Y'' then '' oreder '' else '''' end)||(case when cache_size>0 then '' cache ''||cache_size else '' nocache'' end) from user_sequences where SEQUENCE_NAME='''||robj.object_name||'''' bulk collect into user_source_table;
    50     else
    51           execute immediate 'SELECT TEXT FROM user_SOURCE WHERE name='''||robj.object_name||''' order by line ' bulk collect into user_source_table;
    52     end if;
    53         WHILE pos<=user_source_table.count LOOP
    54       if(line>500)then --防止 文件写入缓存满了
    55               dbms_output.put_line(pos||'  '||robj.object_name);
    56                 UTL_FILE.fflush(OutFile);
    57                 line:=1;
    58             end if;
    59             UTL_FILE.put(OutFile,user_source_table(pos));
    60       pos:=pos+1;
    61             line:=line+1;
    62         END LOOP;
    63     UTL_FILE.put_line(OutFile,chr(10)||'/');
    64         UTL_FILE.put_line(OutFile,'-----------------end   '||robj.object_name||' (line:'||user_source_table.count||'----------------');
    65     pos:=0;
    66     end loop;
    67   UTL_FILE.put_line(OutFile,'-----------------end of file  '||rec.ofile||'----------------',true);
    68     UTL_FILE.FCLOSE(OutFile);
    69 
    70 end loop;
    71 
    72 EXCEPTION
    73   WHEN OTHERS THEN
    74      UTL_FILE.put(OutFile,' pos:'||pos||chr(10)||SQLERRM||chr(10)||dbms_utility.format_error_backtrace);
    75      UTL_FILE.FCLOSE(OutFile);
    76      dbms_output.put_line(SQLERRM||chr(10)||dbms_utility.format_error_backtrace);
    77 END;

    job执行后会在 建立的文件夹里生成备份文件

  • 相关阅读:
    Python注释及变量
    MySQL期末测试
    SQL查询第三次训练(重点关照对象)
    MySQL内置函数
    聚类-kmeans
    《达.芬奇密码》丹-布朗
    皮克定理与证明
    常见设计模式的种类与一些原则
    时间序列(二)分解、各部分计算方法
    ADF检验
  • 原文地址:https://www.cnblogs.com/lzpong/p/5829421.html
Copyright © 2011-2022 走看看