如果数据量不是很大的话,循环完以后再commit.

解决方案 »

  1.   

    在循环内commit是不行的。
    commit会把资源都释放掉,游标也没有了。
    应该在循环外commit
      

  2.   

    我的数据最多能有几百条吧!
         我不是很明白生成一条记录就commit和所有的记录都生成了再commit有什么区别!
        还有,我刚才发现了一个问题,
        有个变量:avar varchar(3);
        v_sql varhcar2(200);
     1   
        begin
          v_sql:='insert into A values('123','d','dd','||avar||')';
          execute immediate v_sql;   
        end;
      2 begin
          insert into A values('123','d','dd',avar);
         end;
      如果avar的值是010,020,030,040,050这种形式的话,
        2 的结果是正确的
        1 的结果却是错误的,把前面的0去掉了;
      非常奇怪,不知道为什么?
      

  3.   

    问题一:视回滚需要确定循环提交还是批量提交,因为在循环提交中一旦出错就涉及到回滚位置的确定,在批量提交中只要有一条出错就全部回滚;效率上应该批量提交更高一些
    问题二:这里涉及到一个隐式转换的问题,比方说'3'和'012'的比较,oracle认为
    这是char型字符比较会认为'3'>'012'
      

  4.   

    在问题二中建议使用动态sql的绑定参数
    v_sql:='insert into A values('123','d','dd',:a)';
    DBMS_SQL.PARSE(V_cursor, V_Sql, DBMS_SQL.V7); 
    DBMS_SQL.Bind_Variable(V_cursor,':a', avar);
      

  5.   

    可以在循环内commit,建议批量commit.