いくつかの行を選択し、その行のプロセス列を別のスレッドが来る前に 'Y'として直ちに更新したいと思っています。oracleで同時に選択して更新する方法
最初のOracleでこれを行うにはどのように
私が働いてイマイチ更新クエリのために選択していました。マルチスレッドモードでこれを実現する方法は何ですか?
私はOracleを使用しており、このフォーラムでoracleに関連する回答を見つけることができませんでしたか?
助けてください
いくつかの行を選択し、その行のプロセス列を別のスレッドが来る前に 'Y'として直ちに更新したいと思っています。oracleで同時に選択して更新する方法
最初のOracleでこれを行うにはどのように
私が働いてイマイチ更新クエリのために選択していました。マルチスレッドモードでこれを実現する方法は何ですか?
私はOracleを使用しており、このフォーラムでoracleに関連する回答を見つけることができませんでしたか?
助けてください
ここでそれを行うための簡単な方法です:
は、テーブルを作成しますテスト呼ば:
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' に更新されると、すべての行が表示されるはずです。
申し訳ありませんが、これは "遅くて遅い"処理であり、ループ内のコミット(booo)で、これがパフォーマンスを妨げる方法です。 -1別の答えで提案されているrationalSpringとしてWHEREを使用してUPDATEを使用すると、長期的に改善されます。 (ちょうどこれに日付を気づいたの?ダッシュボードはなぜ最近のように私にこれを示すのでしょうか? – Ditto
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>
私の提案はあなたの問題を解決しましたか? –
まだあなたのソリューションを試してみてください。明日更新します – Shiv