用insert  into test(a,b,c) select a,b,c from emp;
插入大数据时,如果出错,怎么样知道具体那一行出的

解决方案 »

  1.   

    看看你表的定义,然后SELECT LENGTH(),取出异常数据就好了
      

  2.   


    具体怎么写,我还是不太明白
    insert into test(a,b,c) select a,b,c from emp;
    能批量提交吗
      

  3.   

    可以采用自治事务去处理异常的写入,而不影响其它事务动作给个例子:--创建测试表
    SQL> create table t_test(id number(10) not null,name varchar2(20) not null);Table createdSQL> select * from t_test;         ID NAME
    ----------- --------------------SQL>--创建错误日志记录表
    SQL> create table error_logs(id number(10) not null,
      2 log_timestamp timestamp not null,
      3 error_message varchar2(2000),
      4 constraint error_logs_pk primary key(id))
      5 ;Table created--创建一个自增序列
    SQL> create sequence log_seq start with 1 increment by 1;Sequence created
    --定义一个自治事务的存储过程来记录错误信息
    SQL> create or replace procedure p_log_errors(error_message in varchar2)
      2  as
      3    pragma autonomous_transaction; --自治事务
      4  begin
      5       --往错误日志记录表,插入错误信息
      6       insert into error_logs values(log_seq.nextval,systimestamp,error_message);
      7       commit;
      8  end;
      9  /Procedure created--执行一段PL/SQL,强制产生一个错误,被捕获且记录到日志 
    SQL> begin
      2       insert into t_test values(111,'test111');
      3       insert into t_test values(222,null); --force insert
      4  exception
      5       when others then
      6            p_log_errors(error_message => sqlerrm); --调用自治过程,往错误日志中记录错误信息
      7            rollback; --回滚事务
      8  end;
      9  /PL/SQL procedure successfully completed--查看测试表(无数据插入,因为有异常,事务回滚。)
    SQL> select * from t_test;         ID NAME
    ----------- ----------------------查看错误日志记录表(有错误日志记录!)
    SQL> select * from error_logs;     ID LOG_TIMESTAMP                                 ERROR_MESSAGE
    ------- --------------------------------------------- ------------------------------------------------------
          1 15-1月 -10 09.11.57.897000 上午               ORA-01400: 无法将 NULL 插入 ("SYS"."T_TEST"."NAME")SQL>
      

  4.   


    EXCEPTION
       WHEN OTHERS
       THEN
          v_errcode := SQLCODE;
          v_errmsg := SQLERRM;
          ROLLBACK;
          o_ret := 1;
          p_wf_writeerrlog (
                            v_errcode,
                            v_errmsg
                           );
      

  5.   


    第3行和第4行之间是不是应该有commit啊
      

  6.   

    Create table 不用COMMIT 
      

  7.   


    很感谢您的指点  又学习了但我想知道具体是哪一行出的错,以防出错后可以从出错的地方接着导入
    以insert into test(a,b,c) select a,b,c from emp;
    这种方式导入数据是不是没有办法获取到具体哪一行?
    大家给推荐一种可行的方式  我的数据有几千万条