同步远端数据库的存储过程到本地数据库

同步远端数据库的存储过程到本地数据库

Q:同步数据库的时候表和数据都可以用简单的prc很容易的进行同步,因为通过DB_Link很容易访问,但是对于存储过程、函数、trigger等却不好通过DB_Link访问,所以本过程将把远端数据库的过程、函数等同步到本地的数据库!

学习对utl_file写文件的使用

远程数据库(开发库)有个每天运行的job,它执行sp_etl_reg,sp_etl_lvy,sp_etl_ass这3个存储过程。每个存储过程代表不同的业务模块,每个过程中调用各自模块的许多存储过程来实现本模块的ETL, 本地数据库想把上边3个存储过程中涉及到的存储过程同步到本地

实施步骤:
一:在本地建立DB_LINK

二:需要在init参数中增加utl_file_dir,而本地是以spfile登录的,所以
1〉以sysdba登录本地,create pfile='D:oracleproduct10.2.0 empinit1.ora' from spfile;
2〉打开init1.ora在文件中加入utl_file_dir=D:oracleproduct10.2.0 emp
3〉create spfile='D:oracleproduct10.2.0 empspfileorclzxt.ora' from pfile='D:oracleproduct10.2.0 empinit1.ora';
4〉更改D:oracleproduct10.2.0db_1databaseinitorcl.ora为
SPFILE='d:oracleproduct10.2.0db_1/dbs/SPFILEORCLZXT.ORA'
5〉拷贝D:oracleproduct10.2.0 empspfileorclzxt.ora到d:oracleproduct10.2.0db_1/dbs/SPFILEORCLZXT.ORA
6〉重启数据库
三:建立存储过程save_procedure_to_file_ZXT
create or replace procedure save_procedure_to_file_ZXT is
procedname varchar2(32);
i PLS_INTEGER := 0;
L_output utl_file.file_type;
file_dic varchar2(200) := 'D:oracleproduct10.2.0 emp'; --目录
file_name varchar2(32) := 'pro_zxt.sql'; --生成的文件
cursor proc is --得到每个业务模块中用到的存储过程名称
select x.referenced_name
from user_dependencies@zgcx.com x
where x.type = 'PROCEDURE'
and x.referenced_name like 'SP%'
and x.name in
(upper('sp_etl_reg'), upper('sp_etl_lvy'), upper('sp_etl_ass'))
order by x.name,
x.referenced_name;
-- **********************************************************************
-- 模块名称 : save_procedure_to_file_ZXT
-- 模块编号 :
-- 功能描述 : 同步存储过程
-- 被调用模块: 无
-- 调用模块 : 无
-- Revision : 1.0
-- 创 建 人 : Z.X.T
-- 创建日期 : 2007-06-13
-- 修改日期 :2007-06-13
-- **********************************************************************

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@zgcx.com t
where t.name = procedname
order by line)
LOOP
--写每一个存储过程到文件
UTL_FILE.put_line(L_output,
j.text,
false);
END LOOP;
--在每一个存储过程后增加'/'
UTL_FILE.put_line(L_output,
'/',
false);
end loop;

close proc;

UTL_FILE.fclose(L_output);
end save_procedure_to_file_ZXT;
四:运行save_procedure_to_file_ZXT
五:执行pro_zxt.sql


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/694276/viewspace-51412/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/694276/viewspace-51412/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值