2011-12-30 3 views
0

私の条件は、SOURCEテーブルのレコードをいくつかの条件に基づいてTARGETテーブルに挿入する必要があることです。[カーソルを通過するテーブル​​からフェッチしている条件]。すぐにTARGETテーブルに挿入した後、SOURCEからレコードを削除する必要があります。このフローは、CURSORが空になるまで続きます。Oracle10gでは、同じ問合せで挿入および削除を実行できますか?

私は自分のテーブルに多くのレコードを持っているので、その時間がかかります。これを達成するための他の簡単な方法ですか?

私が上で述べたことは、私がストアドプロシージャの内部に書いていることです。

Thxです。

答えて

2

あなたは主キーを削除することを含むテーブルソースに両方のテーブルの主キーが等しい場合、ここでトリガ機能、そしてレコードを記述する必要があります。

+1

応答のための応答... –

2
  1. サーバーにしてから、往復の多くを作るかもしれないようにいいえ、あなたは

  2. 「同じクエリに」それは、しかし、聞こえることができません。このに最適化できます。

  3. 一つのアプローチは、(アプリケーションがそれらを開始することなく、適切な操作を行うために「の削除」)あなたのインサートにトリガを割り当てることがあるかもしれない

  4. もう一つは、それがをすべて行います(ストアドプロシージャを記述することであるかもしれませんなしサーバー側での作業が可能無関係な往復)。

このリンクは役立つかもしれない:

http://www.devshed.com/c/a/Oracle/Developing-Simple-PL-SQL-Stored-Procedures-for-CRUD-Operations/

+0

応答のためのthx ... –

1

merge文は最終的にいくつかの一致するレコードを削除することができます。

次の例では、マージ後の4つのレコードを含むテーブルが、挿入、更新、および削除によって一度に影響を受けることがわかります。

SQL> create table xxx as 
    2 select rownum as rn, 'xxx' as pla 
    3 from dual 
    4 connect by rownum < 5 
    5/

Table created 
SQL> select * 
    2 from xxx 
    3/

     RN PLA 
---------- --- 
     1 xxx 
     2 xxx 
     3 xxx 
     4 xxx 
SQL> merge into xxx tgt using (
    2   select rownum as rn,mod(rownum,2) as even_odd 
    3   from dual 
    4   connect by rownum < 6 
    5 ) src on (tgt.rn = src.rn) 
    6 when matched then update set tgt.pla = null 
    7  delete where even_odd = 1 
    8 when not matched then insert(rn,pla) values (src.rn,'XXX') 
    9/

5 rows merged 
SQL> select * 
    2 from xxx 
    3/

     RN PLA 
---------- --- 
     2 
     4 
     5 XXX 

SQL> 
関連する問題