有索引

--运行plsql脚本

DECLARE

 TYPE RowIDTab ISTABLE OF ROWID INDEXBY BINARY_INTEGER;

 

 CURSORc1 IS select /*+ index(xifenfei ind_xifenfei) */ rowid

 fromchf.xifenfei

 whereobject_id isNOT NULL;

 

 r RowIDTab;

 rows NATURAL := 20000;

 bad_rows number := 0 ;

 errors number;

 error_code number;

 myrowid rowid;

BEGIN

 OPENc1;

 LOOP

   FETCH c1 BULK COLLECT INTOr LIMIT rows;

   EXITWHENr.count=0;

   BEGIN

    FORALL i INr.FIRST..r.LASTSAVE EXCEPTIONS

     insertinto chf.xifenfei_new      

     select/*+ ROWID(A) */ *

     fromchf.xifenfei A whererowid = r(i);

   EXCEPTION

   whenOTHERS then

    BEGIN

     errors := SQL%BULK_EXCEPTIONS.COUNT;

     FORerr1 IN1..errors LOOP

       error_code := SQL%BULK_EXCEPTIONS(err1).ERROR_CODE;

       if error_code in(1410, 8103) then

         myrowid := r(SQL%BULK_EXCEPTIONS(err1).ERROR_INDEX);

         bad_rows := bad_rows + 1;

         insertinto chf.bad_rows values(myrowid, error_code);

       else

         raise;

       endif;

     ENDLOOP;

     END;

   END;

  commit;

 ENDLOOP;

 commit;

 CLOSEc1;

 dbms_output.put_line('Total Bad Rows: '||bad_rows);

END;

/

没有索引

--找回记录

setserveroutput on

setconcat off        

DECLARE 

 nrows number; 

 rid rowid; 

 dobj number; 

 ROWSPERBLOCK number; 

BEGIN

 ROWSPERBLOCK:=1000; --估算最大的一个块中记录条数

 nrows:=0;

 

 selectdata_object_id  intodobj  

 fromdba_objects  

 whereowner = 'CHF' 

 andobject_name = 'T_XIFENFEI'

-- and subobject_name = '<table partition>'  Add this condition if table is partitioned 

 ;

 

 fori in(selectrelative_fno, block_id, block_id+blocks-1 totblocks            

           fromdba_extents            

           whereowner = 'CHF'             

             andsegment_name = 'T_XIFENFEI' 

-- and partition_name = '<table partition>' Add this condition if table is partitioned

-- and file_id != <OFFLINED DATAFILE> This condition is only used if a datafile needs to be skipped due to ORA-376 (A)

          orderby extent_id)  

 loop  

   forbr ini.block_id..i.totblocks loop  

    forj in1..ROWSPERBLOCK loop 

    begin

      rid := dbms_rowid.ROWID_CREATE(1,dobj,i.relative_fno, br , j-1); 

      insertinto CHF.T_XIFENFEI_NEW      

      select/*+ ROWID(A) */ *        

      fromCHF.T_XIFENFEI A  

      whererowid = rid;          

      if sql%rowcount = 1 thennrows:=nrows+1; endif; 

      if (mod(nrows,10000)=0) thencommit;endif; 

    exceptionwhenothers thennull;

    end;

    endloop; 

  endloop; 

 endloop; 

 COMMIT;

 dbms_output.put_line('Total rows: '||to_char(nrows));

END;

/

 

两个不错的博客

http://www.xifenfei.com/4160.html(核心思想利用rowid读取块内容)

http://www.hellodba.com/reader.php?ID=216&lang=CN(核心思想。数据块替换与拷贝+查询)

sql plus 抢救数据(測)的更多相关文章

  1. SQL SERVER导入数据到ORACLE的方法总结

    我们偶尔会有将数据从SQL SERVER导入到ORACLE当中的这种需求,那么这种跨数据库导数有那些方法呢?这些方法又有那些利弊呢? 下面比较肤浅的总结了一些可行的方法. 1:生成SQL脚本然后去OR ...

  2. SQL Server 变更数据捕获(CDC)监控表数据

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现过程(Realization) 补充说明(Addon) 参考文献(References) ...

  3. SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享

    SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享 第一步建库和建表 USE [master] GO CREATE DATABASE [MonitorElapsedHighSQL] G ...

  4. SQL Server 迁移数据到MySQL

    一.背景 由于项目开始时候使用的数据库是SQL Server,后来把存储的数据库调整为MySQL,所以需要把SQL Server的数据转移到MySQL:由于涉及的表比较多,所以想在MySQL中生成对应 ...

  5. 在SQL Server中将数据导出为XML和Json

        有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做 ...

  6. PHP如何通过SQL语句将数据写入MySQL数据库呢?

    1,php和MySQL建立连接关系 2,打开 3,接受页面数据,PHP录入到指定的表中 1.2两步可直接使用一个数据库链接文件即可:conn.php <?phpmysql_connect(&qu ...

  7. 《SQL Server企业级平台管理实践》读书笔记——SQL Server中数据文件空间使用与管理

    1.表和索引存储结构 在SQL Server2005以前,一个表格是以一个B树或者一个堆(heap)存放的.每个B树或者堆,在sysindexes里面都有一条记录相对应.SQL Server2005以 ...

  8. 通过Sql语句导数据

    在通过SQL Server向导中的SQL语句导数据时,默认情况下源表中的nvarchar字段类型会变成202,解决此问题的方法是,要重新选择一下对应的数据接收表.

  9. 如何使用 SQL Developer 导出数据

    完成此方法文档后,您应该能够了解: 如何使用 SQL Developer 将数据导出为各种文件格式 如何导出模式中的对象定义 目录 1. 简介 2. 软件要求 3. 导出数据 4. 导出对象定义 5. ...

随机推荐

  1. Android学习笔记:进度条ProgressBar的使用以及与AsyncTask的配合使用

    ProgressBar时android用于显示进度的组件.当执行一个比较耗时的操作(如io操作.网络操作等),为了避免界面没有变化让用户体验降低,提供一个进度条可以让用户知道程序还在运行. 一.Pro ...

  2. java设计模式之——适配器模式

    适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的用途 用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极.阴极 ...

  3. 基于visual Studio2013解决算法导论之006最大堆排序

     题目 最大堆排序 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #i ...

  4. 清华集训2014 day2 task1 简单回路

    题目 如题. 算法 就是刚学习的插头DP. 从前往后和从后往前分别进行一次DP. 要点 合法的括号序列只有103个 如何合并两次dp的信息 一开始犯傻了,以为当且仅当两个轮廓线的状态相同才是合法的方案 ...

  5. Tomcat与web程序结构与Http协议

    telnet 一:打开telnet服务: 控制面板------> 程序和功能---> 打开或关闭windows功能---> 选中 Telnet客户端--->确定 二:测试tel ...

  6. 【Cocos2d-x游戏引擎开发笔记(25)】XML解析

    原创文章,转载请注明出处:http://blog.csdn.net/zhy_cheng/article/details/9128819 XML是一种非常重要的文件格式,由于C++对XML的支持非常完善 ...

  7. Cookie 路径在本机测试及服务器部署,在浏览器处理方式上的不同

    Table of Contents 1 问题场景 2 解决过程 2.1 cookie是否设置成功 2.2 cookie是否上传到服务器 3 总结 1 问题场景 最近在学用Python进行web开发,写 ...

  8. OpenRisc-35-基于orpsoc,eCos的sd card controller的测试实验

    引言 之前,曾经在orpsoc的平台上,测试验证过其sd card controller的linux的驱动,但是并不是很完美,经过努力,终于在eCos下完成了其全部功能的验证,包括驱动层验证,文件系统 ...

  9. [Java][activiti]Activiti这个过程委托功能[getAssignee()与getOwner()差异]

    一.流程图: 二.流程定义文件: AssigneeUserAndGroup.bpmn 三.单元測试: ProcessTestDelegateTask.java 四.主要运行语句 // 签收 taskS ...

  10. Swift - 正则表达式的使用(附用户名、邮箱、URL等常用格式验证)

    Swift虽然是一个新出的语言,但却不提供专门的处理正则的语法和类.所以我们只能使用古老的NSRegularExpression类进行正则匹配. 即先接受一个正则表达式的字符串,由此生成NSRegul ...