把包从一个数据库同步到另一个数据库

源库


 
create  table  CUX_PKG_COPY
(
  copy_id    NUMBER ,
  pkg_name   VARCHAR2 ( 30  ),
  copy_date  DATE ,
  type        VARCHAR2 ( 30  ),
  pkg_txt    CLOB   
);
 
create sequence CUX_PKG_COPY_S start with 1;
 
 
 
方法
create  or  replace  procedure  copy_pkg(p_pkg_name  varchar2  )
   /*************************************************
    -- Author    :
    -- Created   : 2016-10-04 12:15:37
    -- Project   : 
    -- Purpose   : 同步一个包
    -- 情   景   :
    -- Parameters: parameter1 => 输入,
                                     parameter2 => 输入,
                                     parameter3 => 输入,
                  
**************************************************/
is
  v_txt       clob ;
  v_pkg_name  varchar2 (  30 ) := p_pkg_name;
  v_count     number ;
   -- set serveroutput on;
  v_id  number ;
begin
   delete  from  cux_pkg_copy pc  where  pc.pkg_name=p_pkg_name;
 
  v_id:=cux_pkg_copy_s.nextval;
  v_count :=  1 ;
   for  cur  in  ( select  us.TEXT
                 from  us
                where  us.TYPE =  'PACKAGE'
                  and  us.name = upper(v_pkg_name)
                order  by  us.line  asc )  loop
     if  v_count =  1  then
      v_txt := v_txt ||  ' create or replace '  || cur.text;
     else
      v_txt := v_txt || cur.text;
     end  if  ;
    v_count := v_count +  1 ;
   end  loop ;
   --v_txt:=v_txt||'/'||chr(13);
   insert  into  cux_pkg_copy
    (copy_id, pkg_name, copy_date,  type , pkg_txt)
   values
    (cux_pkg_copy_s.nextval, p_pkg_name,  sysdate ,  'PACKAGE'  , v_txt);
 
  v_txt   :=  '' ;
  v_count :=  1 ;
   for  cur  in  ( select  us.TEXT
                 from  us
                where  us.TYPE =  'PACKAGE BODY'
                  and  us.name = upper(v_pkg_name)
                order  by  us.line  asc )  loop
     if  v_count =  1  then
      v_txt := v_txt ||  ' create or replace '  || cur.text;
     else
      v_txt := v_txt || cur.text;
     end  if  ;
    v_count := v_count +  1 ;
   end  loop ;
   --v_txt:=v_txt||'/';
   insert  into  cux_pkg_copy
    (copy_id, pkg_name, copy_date,  type , pkg_txt)
   values
    (cux_pkg_copy_s.nextval, p_pkg_name,  sysdate ,  'PACKAGE BODY'  , v_txt);
  
   --p_copy_id:=v_id;
end ;
 
 
 
目标库
create  database  link hec_test2uat2
connect  to  hecuat  identified  by  hecuat
using  '(DESCRIPTION=
                (ADDRESS=(PROTOCOL=tcp)(HOST= 192.168.203.25)(PORT=1521))
                (CONNECT_DATA= (SERVICE_NAME=HECPROD)
                         (INSTANCE_NAME=HECPROD))
 )' ;
 
create  materialized  view  CUX_PKG_COPY_MV  refresh  complete  on  demand    as     select  *  from  cux_pkg_copy@hec_test2uat2;
 
 
 
 
目标库
create  or  replace  procedure  sync_pkg(p_pkg  varchar2  )  is
  v1  number ;
  v_clob  clob ;
begin
  copy_pkg@hec_test2uat2(p_pkg);
  dbms_mview.refresh(list =>  'CUX_PKG_COPY_MV' );
   for  cur  in  ( select  *  from  cux_pkg_copy_mv pc  where  pc.pkg_name = p_pkg)  loop
     select  mv.pkg_txt  into  v_clob  from  cux_pkg_copy_mv mv  where  mv.copy_id=cur.copy_id;
     execute  immediate  v_clob;
   end  loop ;
end ;
 
最近修改的包
 
 
select  uo.OBJECT_NAME, uo.OBJECT_TYPE
   from  user_objects uo
  where  uo.OBJECT_TYPE  in  ( 'PACKAGE'  ,  'PACKAGE BODY','TABLE','VIEW' )
    and  uo.LAST_DDL_TIME >  sysdate  -  7
  order  by  uo.LAST_DDL_TIME  desc  ;
 
 
如何使用这个方法呢?
在目标库
 
begin
  sync_pkg(包名);
end;
 
 

转载于:https://www.cnblogs.com/notfresh/p/5957414.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值