2017-09-11 38 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