0

My requirment here is i have two tables with two attributes.I have written a procedure which should take values(sor_ID) from table1 and update it in Table 2 based on primary key.

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;

This procedure returns nothing updated even after hours of running it. Kindly suggest

4

2 回答 2

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 游标的方法更快、更健壮。

顺便说一句,您还可以使用类似的删除键保留视图的技术来删除子记录。

当然,这并不能回答为什么要将父属性放在子表中的问题。

于 2013-10-17T10:55:37.640 回答
0

我注意到您的程序存在一些问题。

1)它永远运行,因为你的循环没有退出。
2)您的更新语句每次都会更新整个表,因为您没有使用 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;
于 2013-10-17T10:36:53.230 回答