我的要求是我有两个有两个属性的表。我编写了一个程序,它应该从table1获取值(sor_ID)并在表2中根据主键更新它。
Table 1
-------
Primary Key | Sor_ID
AAA | 100
BBB | 200
Table 2
-----
Foreign Key | Sor_ID
AAA | NULL
BBB | NULL
create or replace
Procedure UPDDATE_SORID_2
IS
s_id VARCHAR2(256 byte);
CURSOR C1 IS
SELECT A.SOR_INSTRMNT_ID
FROM TEST_TABLE B,TEMP_SOR_ID A
where A.INSTRMNT_KEY=B.INSTRMNT_KEY;
BEGIN
open c1;
loop
fetch c1 into s_id;
update TEST_TABLE set SOR_INSTRMNT_ID=S_ID;
commit;
end LOOP;
close c1;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001,'An error was encountered - '
||SQLCODE||' -ERROR'||SQLERRM);
end;
即使在运行数小时后,此过程也不会返回任何更新。请建议
答案 0 :(得分:2)
你不需要游标来做这件事。
如果表之间存在外键关系,则可以在已连接的两个表的密钥保留视图上进行更新。
一般模式是:
Update (
select parent_table.key parent_key,
child_table.key child_key,
parent_table.value parent_value,
child_table.value child_value
from parent_table
join child_table on child_table.key = parent_table.key)
set
child_value = parent_value;
这比基于PL / SQL游标的方法更快,更健壮。
顺便提一下,您还可以使用类似的删除密钥保留视图的方法删除子记录。
当然,这并没有回答为什么要在子表中放置父属性的问题。
答案 1 :(得分:0)
我发现你的手术存在一些问题。
1)它会永远运行,因为循环中没有EXIT 2)您的update语句每次都会更新整个表,因为您没有使用WHERE子句。
我建议你改变如下:
CREATE OR REPLACE PROCEDURE upddate_sorid_2
IS
s_id VARCHAR2(256 byte);
s_instrmnt_key VARCHAR2(256 byte);
CURSOR c1 IS
SELECT a.sor_instrmnt_id, a.instrmnt_key
FROM test_table b,temp_sor_id a
WHERE a.instrmnt_key = b.instrmnt_key;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO s_id, s_instrmnt_key;
EXIT WHEN c1%NOTFOUND;
UPDATE test_table
SET sor_instrmnt_id = s_id
WHERE INSTRMNT_KEY = s_instrmnt_key;
END LOOP;
CLOSE c1;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001,'An error was encountered - '
||SQLCODE||' -ERROR'||SQLERRM);
end;