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


    源库


     
    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;
     
     
  • 相关阅读:
    SharedPreferences.Editor 的apply()与commit()方法的区别
    Android 解决方法数 65536 (65k) 限制
    Android RatingBar 自定义样式
    自定义 checkbox 新玩法 ?
    Android 透明度百分比对应的 十六进制
    Linux文件权限rwx简单了解
    Linux学习之Vim使用
    Linux学习之用户管理
    Linux学习之sudo命令
    一元稀疏多项式加法运算
  • 原文地址:https://www.cnblogs.com/notfresh/p/5957414.html
Copyright © 2020-2023  润新知