我是 PL/SQL 新手。我需要更新表employee_details 中的电话号码,其中旧电话号码和新电话号码存储在另一个表phone_no 中(列是old_phone_no
和new_phone_no
)
我想在phone_no
(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 表中的所有行。
寻找 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)
);
我正在考虑定期提交,因为我有大约 1000 万行EMPLOYEE_DETAILS
,我们有很多行EMPOYEE_DETAILS
用于单个电话号码,即OldPhone
来自 table 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;
开始打开所有电话;FETCH all_phones BULK COLLECT INTO phone_olds, phone_news; 关闭所有电话;
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;
结尾;
问候,杰伊。