0

当我在我的 oracle SQL Developer 上运行以下过程时

create or replace
Procedure Table_Update

IS
   s_id VARCHAR2(256 byte);

   CURSOR C1 IS
   SELECT A.SR_ID
   FROM TABLE_2 B,TABLE_1 A
   WHERE A.Primary_key=B.Primary_Key;

BEGIN
loop
   open c1;
   fetch c1 into s_id;

   exit when C1%NOTFOUND ;

   update TABLE_2 set SR_ID = s_id;       

   commit;

   END LOOP;

 CLOSE C1;
END;

table_1 和 table_2 具有相似的结构。我的要求是 table_1 中的 SR_ID 应该根据匹配的主键更新为 table_2。当我运行该过程时,我收到以下错误消息

Connecting to the database XXX.
ORA-06511: PL/SQL: CURSOR ALREADY OPEN
ORA-06512: at "Table_Update", line 7
ORA-06512: at "Table_Update", line 13
ORA-06512: at line 2
PROCESS EXITED.
Disconnecting from the database XXX.

我一遍又一遍地尝试这个,请帮助我

谢谢

4

3 回答 3

4

正如罗杰已经说过的:将光标的开口移到循环之外。

但同样重要的是:也不要在循环内提​​交。这会使事情变慢,给数据库带来更多压力,并且还会关闭游标。

但更重要的是:你根本不需要循环。您可以在单个更新语句中执行此操作:

update TABLE_2 
   set SR_ID = (select a.sr_id 
                from table_1 a 
                where a.primary_key = table_2.primary_key);  

或者使用以下merge语句:

merge into table_2 
using table_1 a
   on (table_2.primary_key = a.primary_key)
when matched then update 
  set sr_id = a.sr_id;

这将比基于光标的方法快得多。

这是一个 SQLFiddle:http ://sqlfiddle.com/#!4/0b810/1

于 2013-06-03T07:38:19.767 回答
3

移出open c1;循环,您只需要打开一次。

于 2013-06-03T07:33:05.073 回答
1

每次越过循环时,您都需要在打开光标open c1;之前移动,并且您应该只打开一次光标。loop

更多信息http://www.techonthenet.com/oracle/cursors/

于 2013-06-03T07:33:57.110 回答