2017-09-11 116 views
1

我有一个在Oracle数据库11g快捷版发布11.2.0.2.0命名INCOMING_MSG表 - 64生产的Oracle PL/SQL包不更新记录

INCOMING_MSG_ID NOT NULL NUMBER(10)  
CREATION_DATE   DATE   
CHANNEL     VARCHAR2(50) 
MESSAGE     VARCHAR2(1024) 
IP_ADDRESS    VARCHAR2(50) 
PARSED   NOT NULL NUMBER(1) 

我只是创建这个包:

procedure parseMsg 
    IS 
     var1 VARCHAR(500); 
     var2 VARCHAR(500); 
     var3 VARCHAR(500); 

     cursor c1 is 
     SELECT incoming_msg_id 
     FROM incoming_msg 
      WHERE parsed = 0; 


    begin 

    FOR psd_rec in c1 
    LOOP 
     UPDATE incoming_msg SET PARSED=1; 

    END LOOP; 
    END; 

end; 

我得到了运行此查询我的SQLDeveloper的所有记录:

SELECT incoming_msg_id 
     FROM incoming_msg 
      WHERE parsed = 0; 

然后我的程序运行也从我的sqldeveloper期望执行后所有的记录将与值parsed = 1但不是这种情况,我不明白为什么不。

回答

1

你忘了commit;where条款由ID:

begin 

FOR psd_rec in c1 
LOOP 
    UPDATE incoming_msg i SET i.PARSED=1 where i.incoming_msg_id = psd_rec .incoming_msg_id; 

END LOOP; 
commit; 
+1

这是最好的'commit'一次,退出循环之后。 – APC

+0

由@APC修复注意,如果有大的记录数可能是1次提交然后数千记录更好 – user7294900

+0

不正确。这种方法可能导致ORA-01002和ORA-01555错误。更不用说如果程序暂停,就很难恢复。 – APC