0

如何将语句insert中删除的行delete放入 DB2 SQL 存储过程中的新表中?

DB2 允许使用以下语法返回已删除的行:

select * from old table (
    delete from my_table where foo > 1
)

出于某种原因,您不能只insert根据该语句返回的结果来执行操作。 但是,您可以使用公用表表达式作为一种笨拙的解决方法

with deleted as (
    select * from old table (delete from my_table where foo > 1)
)
select * from new table (insert into archive_table select * from deleted)

这有一个我不想要的不必要的额外选择语句,但至少它有效。删除的行被插入到另一个表中。

但是,如何在存储过程中执行此操作?

存储过程不允许裸 select 语句。我想把它放在一个set声明中:

set my_var = (
    with deleted as (
        select * from old table (delete from my_table where foo > 1)
    )
    select * from new table (insert into archive_table select * from deleted)
);

但是,这会失败,因为在这样的语句中不允许使用公用表表达式。

有没有办法在存储过程中做到这一点?

(可以使用其他方法作为解决方法来完成任务。但我想知道是否可以这样做。如果不可能,这似乎是一个非常愚蠢的限制。)

更新:我正在使用 DB2 9.7 LUW。

4

2 回答 2

1

如果您发出 a select,则必须以某种方式使用结果集,无论它是在过程中还是在另一个应用程序中。您可以在该过程中运行一个虚拟循环,例如:

for t in (with deleted as (
    select * from old table (delete from my_table where foo > 1)
    )
    select * from new table (insert into archive_table select * from deleted)
) loop
  null;
end loop;

或使用显式游标:

declare c1 cursor for with deleted as (
    select * from old table (delete from my_table where foo > 1)
    )
    select * from new table (insert into archive_table select * from deleted);
...
open c1;
close c1;

请注意,这些都没有经过测试。

于 2013-08-16T13:25:37.617 回答
0

你为什么不把它翻过来?您可以从 SELECT 中插入,也可以从 DELETE 中选择行。

于 2013-08-16T11:04:06.703 回答