`
zjm16
  • 浏览: 70127 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
文章分类
社区版块
存档分类
最新评论

oracle大表复制 存储过程(转)

阅读更多
create or replace procedure P_HPS_TABLEBAK(P_TableOri   in VARCHAR2,
                                           P_TableBack  in VARCHAR2,
                                           P_TemplateId in VARCHAR2,
                                           P_Message    out INTEGER) as

  V_I           number(10);
  V_J           number(10);
  V_ERRCODE     varchar2(100);
  V_ERRMSG      varchar2(100);
  V_COMMITNUM   number := 10000;
  V_COLUMNNAMES varchar2(1000) := '';
  V_COLUMNNAME  T_HPS_TEMPLATE.COLUMN_NAME%type;
  n_insertAll   number := 0;
  v_sql         varchar(500) := 'select * from ' || P_TableOri;
  v_tempsql     varchar(500) := 'select COLUMN_NAME from T_HPS_TEMPLATE where TEMPLATE_ID = ''' ||
                                P_TemplateId || '''';
  O_CALLDATA    PACK_HPS.HPS_CURSOR; --临时游标
begin
  --开始执行复制,锁定表
  EXECUTE IMMEDIATE 'UPDATE T_HPS_TEMPLATE_OUTBOUND SET IS_LOCKED=3 WHERE OUTBOUND_NAME = ''' ||
                    P_TableOri || '''';
  COMMIT;
  EXECUTE IMMEDIATE 'select count(*) from ' || P_TableOri
    into n_insertAll;
  OPEN O_CALLDATA FOR v_tempsql;
  LOOP
    FETCH O_CALLDATA
      INTO V_COLUMNNAME;
    EXIT WHEN O_CALLDATA%NOTFOUND;
    V_COLUMNNAMES := V_COLUMNNAMES || ',' || V_COLUMNNAME;
  END LOOP;
  close O_CALLDATA;
  V_COLUMNNAMES := SUBSTR(V_COLUMNNAMES, 2);
  if n_insertAll > 0 then
    EXECUTE IMMEDIATE 'create table  ' || P_TableBack ||
                      ' as select * from  ' || P_TableOri ||
                      ' where  1!=1 ';
    V_I := MOD(n_insertAll, V_COMMITNUM);
    V_J := n_insertAll / V_COMMITNUM;
    if V_I = 0 then
      V_I := V_J;
    else
      V_I := V_J + 1;
    end if;
    for i in 1 .. V_I loop
      v_sql := 'insert into ' || P_TableBack || ' select ' || V_COLUMNNAMES ||
               ' from (select row_.*, rownum rownum_  from (select *' ||
               ' from ' || P_TableOri || ') row_ where rownum <= ' ||
               V_COMMITNUM * i || ' ) where rownum_ >=' ||
               (V_COMMITNUM * (i - 1) + 1);
      EXECUTE IMMEDIATE v_sql;
      COMMIT;
    end loop;
    EXECUTE IMMEDIATE 'select count(*) from ' || P_TableBack
      into P_Message;
  else
    P_Message := 0;
  end if;
  --任务执行完成,解除表锁定
  EXECUTE IMMEDIATE 'UPDATE T_HPS_TEMPLATE_OUTBOUND SET IS_LOCKED=0 WHERE OUTBOUND_NAME = ''' ||
                    P_TableOri || '''';
  COMMIT;

EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
    --执行失败,解除表锁定
    EXECUTE IMMEDIATE 'UPDATE T_HPS_TEMPLATE_OUTBOUND SET IS_LOCKED=0 WHERE OUTBOUND_NAME = ''' ||
                      P_TableOri || '''';
    COMMIT;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO T_HPS_DEBUGMSG
      (LOGTIME, OBJNAME, MESSAGE)
    VALUES
      (SYSDATE, 'P_HPS_TABLEBAK', V_ERRCODE || ':' || V_ERRMSG);
    OPEN O_CALLDATA FOR
      SELECT 1 FROM DUAL WHERE 1 = 2;
    COMMIT;
    RETURN;
end P_HPS_TABLEBAK;
分享到:
评论

相关推荐

    oracle使用dblink高速复制表数据的动态存储过程

    多年前写的复制目标数据库指定表的数据到本地表。 程序丢了可惜,分享下。 执行存储过程,通过指定目标数据库登录信息,动态生成dblink,打开游标,按批次插入本地指定表中,每批次1万条数据。同步记录和日志信息写...

    Oracle存储过程和函数(最详细包含emp 表实例操作,边看边操作)

    Oracle存储过程和函数(最详细包含emp 表实例操作,边看边操作),目前最详细的存储过程文档,不好你举报我。含好多ORACLE SCOTT中emp表的实例。

    ORACLE数据库复制

    高级复制主要是基于触发器的原理来触发数据同步的,因此,高级复制无法实现用户,数据库级别的对象复制,只能做些表、索引和存储过程的复制。 如果出于容灾整个数据库的考虑,高级复制相当复杂,而且并不一定能...

    Oracle数据库实战:一键执行批量将横表转纵表(横向表转纵向表)

    3、使用Oracle存储过程实现横表转纵表结构,无需繁琐的手动操作,一键执行,适合处理大批量数据转换任务,极大提升数据处理效率。 4、资源中提供了自己验证需要的业务数据、数据库表DDL脚本,可验证学习。 5、本内容...

    oracle定时删除表空间的数据并释放表空间

    Oracle数据库定时删除表空间的数据并释放表空间是通过创建存储过程和定时任务来实现的。下面详细讲解该知识点: 一、创建存储过程 首先,需要创建一个存储过程来删除过期的数据。该存储过程将计算出当前时间减去七...

    sqlserver表数据插入到oracle表中的一种实现方式(表结构相同)

    表结构的创建比较简单,但是表的数据量太大,一时也想不到怎么把sqlserver表数据复制到oracle中,于是请教公司主管,用存储过程实现可以查询出所有数据的insert脚本,在oracle库中创建好表,直接把sqlserver中的...

    针对Oracle远程复制和容灾的解决方案

    文中介绍了针对Oracle数据库的远程复制、容灾主要有以下几种技术或解决方案:基于存储层的容灾复制方案、基于逻辑卷的容灾复制方案、基于Oracle redo log的逻辑复制方式。这类产品的原理基本相同,其工作过程可以...

    plsql创建存储过程并创建job定时任务执行-详细笔记文档总结

    这个存储过程将创建一个名为 test2 的表,并将 test 表中的所有数据复制到 test2 表中。 二、创建 job 定时任务执行 在 Oracle 中,job 定时任务执行是指根据指定的时间间隔执行特定的操作。创建 job 定时任务执行...

    Oracle经典SQL语句

    PLSQL中存储过程及游标的基本使用 Oracle中恢复某张表丢失数据的方法 -- 把SELECT出来的结果导到一个文本文件中 -- 查询新建用户 -- 查询那些用户,操纵了那些表造成了锁机 --看锁阻塞的方法 --ORACLE获得系统信息

    oracle 存储过程和触发器复制数据

    oracle 存储过程和触发器复制数据的代码,需要的朋友可以参考下。

    Oracle 10g应用指导

    在案例精讲中对数据块校验、表的移动、数据文件丢失或损坏、丢失控制文件、数据文件更名以及数据库内文件的复制传输等问题的解决做了全面细致的讲解。第3章SQL及PL/SQL的运行环境及其他开发工具。第4章 Oracle数据...

    Oracle11g从入门到精通2

    6.5.1 复制原表插入记录 6.5.2 使用视图 6.5.3 使用PL/SQL语言 6.5.4 数据查询 第7章 Oracle数据库管理操作 7.1 学会使用视图 7.1.1 增加安全性 7.1.2 隐藏数据的复杂性 7.1.3 实现命名简洁性和易...

    基于ORACLE高级复制技术实现内外网一体化设计方法.pdf

    基于ORACLE高级复制技术实现内外网一体化设计方法 本文介绍了青岛市劳动和社会保障局基于ORACLE高级复制技术实现内外网业务受理的一体化电子政务解决方案。该解决方案采用异步复制技术,实现了内外网数据的一致性和...

    oracle实验报告

    2、 定义一个为修改职工表(emp)中某职工工资的存储过程子程序,职工名作为形参,若该职工名在职工表中查找不到,就在屏幕上提示“查无此人”然后结束子程序的执行;否则若工种为MANAGER的,则工资加$1000;工种为...

    Oracle官方培训教程

     Oracle也许是最流行的服务器,占有最大的市场份额,它被广泛用于各个市场领域,满足一系列的存储需求,例如财务记录,人力资源及订单编制等,造成这种现象的原因之一在于Oracle较早的进入RDBMS(关系型数据库管理...

    Oracle数据库管理员技术指南

    3.4.3 为卸载表的导出过程的选择语句 指定一个查询 3.4.4 导出/导入预计算优化程序统计 数据 3.4.5 可移动表空间 3.5 回顾 第4章 设计高可用性数据库 4.1 如何发现和保护“致命的弱点” 4.2 复用数据库控制...

    Oracle数据库异地容灾方案.doc

    Oracle 数据库异地容灾方案是指在两个或多个数据中心之间,使用连续数据复制技术实现数据库的异地容灾备份和恢复。该方案旨在提供高可用性和高可靠性的数据库服务,能够满足企业对数据安全和可用性的要求。 ...

    oracle从入门到精通.pdf

    * 表:是一个数据库中的逻辑存储单元,用于存储相关数据。 * 字段:是表中的一个单元,用于存储特定类型的数据。 * 记录:是表中的一个实例,包含所有字段的值。 1.2、数据库安全 * 用户身份验证:验证用户的身份...

Global site tag (gtag.js) - Google Analytics