簡體   English   中英

PL / SQL異常處理

[英]PL/SQL exception handling

我對PL / SQL編程還很陌生,並且過去2個小時一直在嘗試解決此問題

這是我的代碼

CREATE OR REPLACE PROCEDURE xx_upd_new_code AS   

  CURSOR c1 IS
    SELECT
      eite.t_ep_item_ep_id,
      bite.main_item
    FROM bidw.item@demantra bite,
      t_ep_item eite
    WHERE bite.item_code = eite.item
          AND bite.main_item = bite.old_code
          AND bite.current_flag = 1
          AND bite.main_item IS NOT NULL;

  a1 c1%ROWTYPE;

  BEGIN
    xx_dbex('Starts.', 'xx_upd_new_code', 'XX');

    OPEN c1;
    LOOP
      FETCH c1 INTO a1;
      EXIT WHEN c1%NOTFOUND;

      xx_dbex('Item: ' || a1.main_item, 'xx_upd_new_code', 'XX');

      UPDATE t_ep_item
      SET item = a1.main_item
      WHERE t_ep_item_ep_id = a1.t_ep_item_ep_id;

      COMMIT;

      xx_dbex('Ends.', 'xx_upd_new_code', 'XX');
    END LOOP;

    EXCEPTION 
    WHEN OTHERS THEN xx_dbex('Error.', 'xx_upd_new_code', 'XX');   
  END xx_upd_new_code;

每當遇到錯誤時,過程都會結束,但我希望它移至下一個項目。 xx_debex是存儲日志的過程。

我一直在谷歌搜索,發現我可以寫兩個異常並且可以在條件不滿足的情況下引發異常。我嘗試了一下,但是它拋出一個錯誤標識符,必須聲明一個標識符項,必須聲明

CREATE OR REPLACE PROCEDURE xx_upd_new_code AS   

  CURSOR c1 IS
    SELECT
      eite.t_ep_item_ep_id,
      bite.main_item
    FROM bidw.item@demantra bite,
      t_ep_item eite,
      items ite
    WHERE bite.item_code = eite.item
          AND bite.main_item = bite.old_code
          AND bite.current_flag = 1              
          AND bite.main_item IS NOT NULL;

  a1 c1%ROWTYPE;

  BEGIN
    xx_dbex('Starts.', 'xx_upd_new_code', 'XX');

    OPEN c1;
    LOOP
      FETCH c1 INTO a1;
      EXIT WHEN c1%NOTFOUND;

      IF item != a1.main_item THEN
        xx_dbex('Item: ' || a1.main_item, 'xx_upd_new_code', 'XX');

        UPDATE t_ep_item
        SET item = a1.main_item
        WHERE t_ep_item_ep_id = a1.t_ep_item_ep_id;
        COMMIT;

        xx_dbex('Ends.', 'xx_upd_new_code', 'XX');          
      ELSE
        RAISE a;
      END IF;

    END LOOP;

    EXCEPTION 
      WHEN a THEN xx_dbex('Error.', 'xx_upd_new_code', 'XX');
      WHEN OTHERS THEN NULL;   
  END xx_upd_new_code;

另外,在寫它的地方,我可以寫在兩個不同的塊中

CREATE OR REPLACE PROCEDURE xx_upd_new_code AS

  CURSOR c1 IS
    SELECT
      eite.t_ep_item_ep_id,
      bite.main_item
    FROM bidw.item@demantra bite,
      t_ep_item eite
    WHERE bite.item_code = eite.item
          AND bite.main_item = bite.old_code
          AND bite.current_flag = 1
          AND bite.main_item IS NOT NULL;

  a1 c1%ROWTYPE;

  BEGIN
    xx_dbex('Starts.', 'xx_upd_new_code', 'XX');

    BEGIN

      EXCEPTION
      WHEN OTHERS THEN xx_dbex('Error', 'xx_upd_new_code', 'XX');
    END;

    OPEN c1;
    LOOP
      FETCH c1 INTO a1;
      EXIT WHEN c1%NOTFOUND;

      xx_dbex('Item: ' || a1.main_item, 'xx_upd_new_code', 'XX');
      UPDATE t_ep_item
      SET item = a1.main_item
      WHERE t_ep_item_ep_id = a1.t_ep_item_ep_id;
      COMMIT;

    END LOOP;

    EXCEPTION WHEN OTHERS THEN
    xx_dbex('END', 'xx_upd_new_code', 'XX'); 
  END xx_upd_new_code;

我仍然無法弄清楚。

將光標循環分為兩個部分/塊。 第一個用於調用日志記錄過程的部分,另一個用於更新表的部分。 您的代碼主體應如下所示:

  BEGIN
     Open C1; 
     loop
        fetch C1 into A1;
        exit when C1%NOTFOUND
        BEGIN
           xx_dbex('Item: '||a1.main_item ,'xx_upd_new_code', 'XX');
        END;
        BEGIN
           UPDATE t_ep_item 
           SET item = a1.main_item
           where t_ep_item_ep_id=a1.t_ep_item_ep_id;
           COMMIT;
           xx_dbex('Ends.','xx_upd_new_code', 'XX');
        EXCEPTION
           WHEN OTHERS THEN 
              xx_dbex('Ends.','ERROR', 'XX');
        END;
  END LOOP;

希望你明白

只需將循環內的語句封裝到一個新的pl / sql塊中,如下所示:

loop
 begin
  fetch ...
 exception
  when ...
 end;
end loop;

順便說一句。 日志記錄過程應使用pragma_autonomous_transactioncommit獨立於當前事務結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM