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 ステートメントがありますが、少なくとも機能します。削除された行は別のテーブルに挿入されます。

ただし、ストアド プロシージャ内でこれを行うにはどうすればよいでしょうか。

ストアド プロシージャでは、そのままの 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

を発行する場合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 に答える