私はPL/SQLが初めてです。私はphone_no
の最初の行をしたい、古い電話番号と新しい電話番号に別のテーブルPHONE_NOに格納されたテーブルemployee_detailsに電話番号を更新するための要件(カラムはold_phone_no
とnew_phone_no
ある)Pl sqlブロックは、定期的なコミットを使用してテーブルを一時テーブルの値で更新します。
(old_phone_no
を持っており、 new_phone_no
)、定期的にコミットしてemployee_detailsの更新文(update employee_details set phone_no=new_phone_no where phone_no=old_phone_no
)を実行します。
phone_noテーブルのすべての行を通過するまで、同じプロセスを続行する必要があります。
スタックオーバーフローのすべての専門家からの回答を検索します。
Create statements.
--Table which needs to be updated
CREATE TABLE EMPLOYEE_DETAILS
(
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
PhoneNumber varchar(255)
);
-- Temp Table which contains old and new phone numbers
CREATE TABLE PHONE_NO
(
PersonID int,
OldPhone varchar(255),
NewPhone varchar(255)
);
私はEMPLOYEE_DETAILS
で約10万行を持っており、私たちはテーブルPHONE_NO
からOldPhone
すなわち、単一の電話番号をEMPOYEE_DETAILS
に多くの行を持っているように私は、定期的なコミットを考えていました。
私は生産パフォーマンスを邪魔したくありません。私はそれを行う他の方法があれば大丈夫です。
下記の方法が有効かどうか。
DECLARE CURSOR のall_phones OldPhoneによってPHONE_NO 注文から SELECT OldPhone、NewPhone されます。
TYPE phone_old IS TABLE OF PHONE_NO.OldPhone%TYPE;
TYPE phone_new IS TABLE OF PHONE_NO.NewPhone%TYPE;
phone_olds phone_old;
phone_news phone_new;
inx1 PLS_INTEGER;
BEGIN OPEN all_phones; FETCH all_phones BULKはphone_olds、phone_newsに集約されます。 CLOSE all_phones;
FOR inx1 IN 1..phone_olds.count LOOP
begin
loop
update EMPLOYEE_DETAILS
set PhoneNumber = phone_news(inx1)
where PhoneNumber = phone_olds(inx1)
and rowcount <= 10000;
continue when sql%notfound;
commit;
end loop
commit;
END LOOP;
END;
よろしく、 Jay。
[編集]あなたの質問や追加'両方のテーブルのためのtable'文を作成する(_formatted_テキストください、[なしスクリーンショット](http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-尋ねるときの質問/ 285557#285557))。 "* with periodic commits *"は通常、Oracleでは良い考えではありません。なぜストアドプロシージャが必要だと思いますか? –
これは本当に難しい問題です。なぜなら、あなたは 'JOIN'のために働く列を更新しているからです。だから簡単な解決策はありません。本当に、単一の 'MERGE'ステートメントでもそれを処理することはできません。結合を単純化するために、 'employee_details'に' PersonID'を追加してください。 – Benoit