2012-03-09 7 views
3

私が持っている質問は、どのようにして読み込み時にレコードを削除できますか?私は、C++アプリケーションでRoguewave DB Layerを使用してOracle ond AIXを使用しています。Oracle sql delete on read

Googleはこの回答をGoogleで検索していますが、単純な例しかないようです。削除された行を返すSQL文がありますか?

これは、ケースの0.1%だけがこのテーブルに留まる必要があるため、つまりテーブルに0.1%挿入するため、アプリケーションのパフォーマンスが大幅に向上します。

私が見つけた唯一のヒントは、 "Into"句です。私はdelete intoを使用するとジョブを実行すると思いますが、私はこれを使ったことがないと思います。

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/returninginto_clause.htm

答えて

5

oracle documentationによると、 one go:

DELETE FROM employees 
    WHERE job_id = 'SA_REP' 
    AND hire_date + TO_YMINTERVAL('01-00') < SYSDATE 
    RETURNING salary INTO :bnd1; 

私は決してそれを使用しませんでしたが、試してみることもできます。

+0

私はこれが私が構文を賢明にしたいと思う、それは現時点では実行されませんが、私はそれが動作するようにしようとします –

+0

良い答え。しかし、これはストアドプロシージャでのみ動作しますか?または、たとえばから直接使用できますか? JDBC? – sleske

+0

@sleske:ストアドプロシージャなしでOCCIを使用して 'select'ステートメントで' returning'節を使用しましたが、うまくいきました。これは別のシナリオ(他のdbレイヤー)なので、私は確信が持てません。 – nabulke

0

あなたは、監査トリガーを構築するようなものを試したことがありますか?

Good description to build an select trigger.

作成:

begin 
    dbms_fga.add_policy 
    (object_schema=>'SCOTT' 
    , object_name=>'EMP' 
    , policy_name=>'SAL_ACCESS_HANDLED' 
    , audit_column => 'SAL' 
    , audit_condition => 'SAL>= 1500' 
    , handler_schema => 'SCOTT' 
    , handler_module => 'AUDIT_HANDLER.HANDLE_EMP_SAL_ACCESS' 
); 
end; 
/

関数のシグネチャは:

PROCEDURE HANDLE_EMP_SAL_ACCESS 
(object_schema VARCHAR2 
, object_name VARCHAR2 
, policy_name VARCHAR2 
); 
+0

OPはどのように役立ちますか?行はどこで削除されますか? – sleske

+0

私は実際にトリガを解決策として考えていませんでしたが、私の前提はトリガがフォークのように動作するということでした。選択 - >データ(フォークトリガ) - >データをアプリケーションに戻して、理解が間違っていると教えてください。 –

+0

呼び出されたプロシージャ内の削除への挿入?私は、再試行せずに関数内のテーブルを変更することが可能な場合、試していないことを認めなければなりません。 – Eggi

1

はありません、読んで、一度に行を削除するには何のSQL構文はありません。

これを行うストアドプロシージャを書くこともできます。または、すでに読み取ったレコードをメモリにキャッシュして(再度読み取らないように)、後で一括削除(DELETE FROM table WHERE id in (?))を実行できます。それは多くの単一のDELETEより速くなければなりません。

また、問題に対する別のアプローチを検討することもできます。あなたはなぜそれを読んで多くの行を削除する必要がありますか?メッセージを渡すためにDBテーブルを使用していますか?あなたの問題にもっと適した別のテクノロジーがありますか?技術の確立された慣習に反して作業しなければならないと感じたら、それはあなたが仕事に適切なツールを使用していないことを示すかもしれません...