2011-12-21 68 views
0

大家好,我對PL/SQL有點新,所以有點困惑。我有一個名爲rec的光標,並通過它循環播放,我有兩個嵌套的IF語句。PL/SQl嵌套如果循環內部如果循環不退出

CURSOR Cur IS 
    SELECT Mil.Id, 
      Mil.Record_Num, 
      Mil.Status, 
      Mil.file_processed, 
      Mil.Updated_By 
     FROM status_log mil 
    WHERE Mil.file_processed != 'Processed' 
    For Update of Mil.file_processed; 

FOR Rec IN Cur LOOP 

       IF (Rec.status = 'Ready' OR Rec.status = 'Go') THEN 
        IF Length(Rec.Zip) = 5 AND 
       (Substr(Rec.Zip, 1, 3) = '303' OR 
       Substr(Rec.Zip, 1, 3) = '304') THEN 

         l_state:= 'ATL';        
        END IF; 

      UPDATE status_log mil 
      SET file_processed = 'Processed' 
      WHERE current of cur   

     END IF; 

COMMIT; 
      END LOOP; 

現在,只要將光標具有滿足第二IF一個記錄(即Zip是5的長度和代碼開始與303或304),它沒有再命中update語句的記錄,所有記錄後。我甚至試圖在IF循環中的邏輯之後使用EXIT語句,但無濟於事。我究竟做錯了什麼?

+0

請張貼遊標,並且「代碼做某事」:) – 2011-12-21 20:26:41

+2

有沒有機會拋出一個錯誤並默默退出? (也就是說,當其他程序有空時,你的程序有異常;') – Allan 2011-12-21 20:27:08

+0

嗨,代碼做一些事情,我只是將一個變量設置爲一個特定的值。該代碼不負責,因爲我評論說,並試圖用空白塊運行它,但同樣的問題。編輯了一下代碼檢查更新。 – Eosphorus 2011-12-21 21:58:48

回答

2

如果不是循環。這可能實際上是一個重要的觀點,因爲你說你已經試過使用EXIT,並且該語句的目的是從立即封閉的循環中退出。在這種情況下,這意味着遊標上的循環(除非可能您的「代碼做某事」包括其他循環)。所以你放在那裏的任何EXIT都會導致整個循環終止。

如果它不執行更新,那麼「代碼做一些」是任一(a)使用的明確命令,影響的流量控制,如EXITCONTINUE,或GOTO,或(b)遇到導致控制切換到某處的某個異常處理程序的錯誤。

如果執行更新但失敗,那麼您應該看到一個錯誤 - 除非再次出現了一個異常處理程序,它會將其隱藏起來。

+0

做些什麼只是爲變量設置一個值。我試圖通過評論該部分,但沒有運氣使用空白循環:( – Eosphorus 2011-12-21 22:09:08

0

檢查您的CURSOR定義是否包含表status_log ......這可能是問題所在。

+0

不應該是原因 - Oracle保證光標一旦打開就「看到」一組一致的數據。 – 2011-12-21 20:05:40

1
  1. 有可能要更新的status_log行被另一個會話鎖定。 您可以查詢v $ session視圖的blocking_session列。

  2. 「做某事的代碼」正在做某事。

  3. 更新列file_processed但鎖定列status的行。我沒有測試過,但這可能是一個問題。
+0

其實對不起,這是我的錯字我鎖定file_processed不是狀態。編輯帖子。我認爲我只是在某處發生異常,而我們用來記錄錯誤的軟件包不起作用。所以我正在寫一些dbms輸出行來看看發生了什麼 – Eosphorus 2011-12-21 22:37:33