oracle plsql儲存過程_if判斷與事務commit

wisdomone1發表於2012-05-10
因工作批次有如下類似程式碼IF (lvnCheckPointCtr > lcnCOMMITAFTER) THEN
    
      lvsBatchActvMsg := 'Attempting to update CheckPoint in QueApplHist table';
    
      lvsCheckPointUpdateText := lcsCHECKPOINTTEXT_PROCESS ||
                                 lvnPrevAcctNbr ||
                                 lcsCHECKPOINTTEXT_RESTART ||
                                 lvnPrevAcctNbr;
    
      UPDATE QueApplHist
         SET CheckPoint = lvsCheckPointUpdateText, DateLastMaint = SYSDATE
       WHERE QueNbr = in_QUENBR
         AND ApplNbr = in_APPLNBR
         AND QueSubNbr = in_QUESUBNBR
         AND StartDateTime = lvdtStartDateTime;
    
      IF (SQL%ROWCOUNT = 0) THEN
        RAISE OSI_GENERAL_ERROR;
      END IF;
    
      COMMIT;
    
      lvnCheckPointCtr := 0;
    
    END IF;
初一看,我認為commit只會提交if程式碼塊中的dml語句,而不會提交if程式碼塊之前的dml,經測試後,發現結論與想我的不致.

 附上測試程式碼

SQL> create table log_test(seq int,logman varchar2(10));

Table created

SQL> create table other_log(seq int,logman varchar2(10));

Table created

SQL> declare
  2  va varchar2(10);
  3  b integer;
  4  begin
  5  insert into log_test values(1,'zhaixy');
  6  va:='sex';
  7  if (va='sex') then
  8  dbms_output.put_line('haha');
  9  insert into other_log values(1,'zhaixy');
 10  commit;
 11  end if;
 12  end;
 13  /

haha

用plsql developer開啟新的會話,查詢log_test及other_log表
發現兩表皆插入了資料,而不是我之前想的僅插入if程式碼塊中的other_log

結論:
   if程式碼塊中的commit語句會一併提交if程式碼塊及之if程式碼塊之前所有的dml

            再次說明對於事務的理解不夠清晰與深入.
 
   目前從事的金融行業,事務的重要性是不言而喻.努力學習吧

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-723265/,如需轉載,請註明出處,否則將追究法律責任。

相關文章