PL/SQL は初めてです。古い電話番号と新しい電話番号が別のテーブル phone_no に格納されているテーブル employee_details の電話番号を更新する必要があります (列はold_phone_no
とですnew_phone_no
)
phone_no
( old_phone_no
and ) の最初の行を取得し、定期的なコミットを使用しnew_phone_no
て、employee_details ie ( ) で update ステートメントを実行したいと考えています。update employee_details set phone_no=new_phone_no where phone_no=old_phone_no
phone_no テーブルのすべての行をトラバースするまで、同じプロセスを続ける必要があります。
Stack Overflow のすべての専門家からの回答を探しています。
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)
);
約1,000万行あり、単一の電話番号、つまりテーブルからEMPLOYEE_DETAILS
多くの行があるため、定期的なコミットを考えていました。EMPOYEE_DETAILS
OldPhone
PHONE_NO
本番のパフォーマンスを邪魔したくありません。他に方法があれば大丈夫です。
以下の方法が機能するかどうか。
DECLARE CURSOR all_phones IS SELECT OldPhone, NewPhone FROM PHONE_NO ORDER by OldPhone;
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 COLLECT INTO phone_olds, phone_news; 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;
終わり;
よろしく、ジェイ。