0

分割されたテーブルと更新関数/トリガーがあります。行が更新されると、最初に行が削除され、次に適切なパーティションに挿入されます。私の質問は、Oracle で MERGE に似たステートメントを実行しようとしているということです。次のような UPSERT を使用した Postgres での同様の実装への参照を見つけました。

WITH upsert as
(
   update mytable2 m 
      set sales=m.sales+d.sales, 
          status=d.status 
   from mytable d 
   where m.pid=d.pid
   RETURNING m.*
)
insert into mytable2 
select a.pid, a.sales, 'NEW' 
from mytable a 
where a.pid not in (select b.pid from upsert b);

ただし、問題は、更新が最初に発生することです。特定の行で削除と挿入が発生し、その後、挿入が再度挿入されます。これは、パーティションの更新機能/トリガーによるものです。これを Oracle でのマージ (つまり、行が見つかった場合は更新、そうでない場合は挿入) のように機能させる方法はありますか?

あなたの助けは大歓迎です!

4

1 に答える 1

0

ここでの問題は、null を返すトリガーと、返された結果を期待するアップサートの交差にあります。本質的に、あなたがしていることは次のとおりです。

  1. 行を削除
  2. 行を挿入
  3. 更新を中止します (これがアップサートを台無しにするものです)
  4. 更新が完了したかどうかを確認し、挿入されていない場合は確認します。

これは、トリガーがソフトウェアの流れを壊すため、いくつかの問題が発生するケースです。

では、これを機能させる方法は.....

非常に大きなセットでこれを機能させる簡単な方法はわかりません。更新部分を呼び出し可能な関数に移動する必要があると思います。その関数の詳細は、実際に一度に更新する行数によって異なります。次にINSERT ... SELECT、CTEの代わりに関数呼び出しを使用して、行っていることと同様のことを行うことができます.

于 2013-04-19T04:27:08.307 に答える