oraclesql的批处理

oraclesql的批处理,sql,oracle,Sql,Oracle,我使用以下查询将数据从一个表复制到同一数据库中的另一个表中“插入到表中选择*从时间戳所在的表中选择”为什么要这样做?这会使过程更慢,更难编码,更难在发生错误时恢复 除非有特殊原因,否则只能在最后提交,否则必须编写PL/SQL来完成 您的代码应该是: insert into table select * from table where time_stamp <= ADD_MONTHS(sysdate,-1); 插入到表中 挑选* 从桌子上 时间戳为什么要这样做?它会使过程变得更慢,更难编

我使用以下查询将数据从一个表复制到同一数据库中的另一个表中“插入到表中选择*从时间戳所在的表中选择”为什么要这样做?这会使过程更慢,更难编码,更难在发生错误时恢复

除非有特殊原因,否则只能在最后提交,否则必须编写PL/SQL来完成

您的代码应该是:

insert into table
select *
from table
where time_stamp <= ADD_MONTHS(sysdate,-1);
插入到表中
挑选*
从桌子上

时间戳为什么要这样做?它会使过程变得更慢,更难编码,在发生错误时更难恢复

除非有特殊原因,否则只能在最后提交,否则必须编写PL/SQL来完成

您的代码应该是:

insert into table
select *
from table
where time_stamp <= ADD_MONTHS(sysdate,-1);
插入到表中
挑选*
从桌子上

其中时间戳是可以用来实现目标的PL/SQL块

declare
  cursor c is
    select *
    from tableName
    where time_stamp <= add_months(sysdate,-1);

  type tbl is table of c%rowtype;

  t     tbl;
begin
  open c;

  loop
    fetch c bulk collect into t limit 1000;

    exit when c%notfound;

    forall i in 1..t.count
    insert into tableName2 values t(i);

    commit;
  end loop;

  close c;
end;
e、 g.像那样

insert into tableName2(col1,col2) values t(i).col1,t(i).col2;

我还没有测试,但这更多的是关于如何做的想法。

这是可以用来实现目标的PL/SQL块

declare
  cursor c is
    select *
    from tableName
    where time_stamp <= add_months(sysdate,-1);

  type tbl is table of c%rowtype;

  t     tbl;
begin
  open c;

  loop
    fetch c bulk collect into t limit 1000;

    exit when c%notfound;

    forall i in 1..t.count
    insert into tableName2 values t(i);

    commit;
  end loop;

  close c;
end;
e、 g.像那样

insert into tableName2(col1,col2) values t(i).col1,t(i).col2;

我还没有测试过,但这更多的是关于如何做的想法。

该代码工作得很好,但记录的数量以百万计,最好是以百万计进行复制batches@user3274312-为什么你认为分批做比较好?(,这与大卫所说的相呼应)。为了“数百万”“如果您可以在插入过程中锁定表,那么我也会考虑直接路径插入。@user3274312您预期会出现什么类型的错误,如果出现任何错误,您计划如何确定哪些记录已成功插入,确定问题记录,并仅插入其他记录?你看过Oracle的日志错误功能吗?@user3274312-如果在复制将回滚的批处理时发生任何错误;你将如何从那个位置上恢复?你不能只是重新启动,因为你会得到重复的。如果你从下一批继续,你怎么知道哪些记录丢失了?看来你只是让自己的生活更艰难。您还可以查看一个示例,以便跳过出错的行,而不必回滚成功的行。该代码工作正常,但记录数以百万计,最好在batches@user3274312-为什么你认为分批做比较好?(,这与David所说的相呼应)。对于“数百万”,我也会考虑直接路径插入,如果您可以在插入过程中不锁定表。@user3274312您预期会出现什么类型的错误,如果出现任何错误,您将如何计划确定哪些记录已成功插入,并确定问题记录,只插入其他的?你看过Oracle的日志错误功能吗?@user3274312-如果在复制将回滚的批处理时发生任何错误;你将如何从那个位置上恢复?你不能只是重新启动,因为你会得到重复的。如果你从下一批继续,你怎么知道哪些记录丢失了?看来你只是让自己的生活更艰难。您还可以查看一个示例,以便跳过出错的行,而不必回滚成功的行。将
保存异常
添加到FORALL可能会捕获异常(约束)并继续下一条记录。否则,当出现一个异常时,它将停止。将
SAVE EXCEPTIONS
附加到FORALL的更多详细信息可能会捕获异常(约束)并继续下一条记录。否则,当出现一个异常时,它将停止。来自的更多详细信息如果需要复制整个表,请尝试使用CTA(以选择方式创建表),然后一次性完成。如果需要复制整个表,请尝试使用CTA(以选择方式创建表),然后一次性完成。