oracle 数据库对象自动备份
本文介绍一种数据库对象备份的方法。其原因是因为我在开发时有两个数据库用户,他们的数据表结构相同,所开发的存储过程也相同,但是数据却是不同地方的数据。因为懒惰所以在修改过程包时只想修改一次就ok,所以想了一个半自动的办法,让数据库自动备份数据库对象,然后编写bat文件进行同步更新。
首先要明确主次,我把a数据库用户作为修改对象,b数据库用户只是同步更新。ok
步骤:
一、用dba身份登录数据库,给a数据库用户指定一个存储路径‘d:\test’,并授予读写的权限。
create or replace directory D_OUTPUT as 'D:\test';
grant read,write on directory D_OUTPUT to a;
GRANT EXECUTE ON utl_file TO a;
二、用a登录数据库,编写自动备份包的过程。
create or replace procedure save_PACKAGEtoSQL_thomas is
procedname varchar2(32);
i PLS_INTEGER := 0;
L_output utl_file.file_type;
file_dic varchar2(200) := 'D_OUTPUT'; --目录
file_name varchar2(32) := 'pro.sql'; --生成的文件
cursor proc is --得到每个业务模块中用到的存储过程名称
select x.referenced_name
from user_dependencies x
where x.referenced_type = 'PACKAGE'
group by x.referenced_name;
begin
--打开文件
L_output := utl_file.fopen(file_dic, file_name, 'a');
--循环得到每一个存储过程名称
open proc;
loop
fetch proc
into procedname;
exit when proc%notfound;
i := i + 1;
dbms_output.put_line('procedname' || i || '=' || procedname);
--得到每一个存储过程的source
for j in (select decode(t.line,
1,
'Create or replace ' || t.text,
t.text) text
from user_source t
where t.name = procedname
and t.type = 'PACKAGE'
order by line) LOOP
--写每一个存储过程包到文件
UTL_FILE.put_line(L_output, j.text, false);
END LOOP;
--在每一个存储过程后增加'/'
UTL_FILE.put_line(L_output, '/', false);
for j in (select decode(t.line,
1,
'Create or replace ' || t.text,
t.text) text
from user_source t
where t.name = procedname
and t.
