2011-07-19 14 views
1

いくつかの行を選択し、その行のプロセス列を別のスレッドが来る前に 'Y'として直ちに更新したいと思っています。oracleで同時に選択して更新する方法

最初のOracle

でこれを行うにはどのように

私が働いてイマイチ更新クエリのために選択していました。マルチスレッドモードでこれを実現する方法は何ですか?

私はOracleを使用しており、このフォーラムでoracleに関連する回答を見つけることができませんでしたか?

助けてください

+0

私の提案はあなたの問題を解決しましたか? –

+0

まだあなたのソリューションを試してみてください。明日更新します – Shiv

答えて

3

ここでそれを行うための簡単な方法です:

は、テーブルを作成しますテスト呼ば:

insert into test values (1, 'BOB'); 
insert into test values (2, 'PETER'); 
insert into test values (3, 'BOB'); 
insert into test values (4, 'PETER'); 
insert into test values (5, 'BOB'); 

ラン:テーブルテスト

create table test (id number, col_to_update varchar2(20)); 

挿入データをPL/SQLブロック:

declare 
    cursor c1 is 
    select id 
     , col_to_update 
      from test 
     where col_to_update = 'BOB' 
    for update of col_to_update; 
begin 
    for c1_rec in c1 loop 
     update test 
       set col_to_update = 'UPDATED' 
      where current of c1; 
     commit; 
    end loop; 
end; 
/

結果:

あなたはcol_to_update 'BOBが' 'UPDATE' に更新されると、すべての行が表示されるはずです。

+0

申し訳ありませんが、これは "遅くて遅い"処理であり、ループ内のコミット(booo)で、これがパフォーマンスを妨げる方法です。 -1別の答えで提案されているrationalSpringとしてWHEREを使用してUPDATEを使用すると、長期的に改善されます。 (ちょうどこれに日付を気づいたの?ダッシュボードはなぜ最近のように私にこれを示すのでしょうか? – Ditto

6

oracleの "RETURNING"節はこれを行います。

INSERT INTO <table> (c1, c2, .., cn) VALUES (v1, v2, .., vn) RETURNING <expression> INTO <variables> 

UPDATE <table> SET (c1) = (v1), (c2) = (v2), (cn) = (vn) WHERE <condition> RETURNING <expression> INTO <variables> 

DELETE FROM <table> WHERE <condition> RETURNING <expression> INTO <variables> 
+0

私は最初に選択して更新したいと思います。私は選択するまでどれを更新するかわかりません – Shiv

+3

上記の質問でwhere句を解決しないでしょうか? –

+0

私はこれを試みます。私はオラクルの初心者です。 – Shiv

関連する問題