簡體   English   中英

使用FOR LOOP和EXECUTE IMMEDIATE進行異常處理

[英]Exception handling with FOR LOOP and EXECUTE IMMEDIATE

我的任務是打印表格的總列數。 然后對於特定的ID,僅打印具有值的那些列的名稱(如果列包含該特定ID的null,則跳過該列)。 我在FOR LOOP中的代碼中使用EXECUTE IMMEDIATE 如果EXECUTE IMMEDIATE在列中未找到任何數據,那么它將拋出no_data_exception,我可以處理該異常,但是在該異常之后我無法繼續循環。

DECLARE
    COL_TOTAL_NUM NUMBER;
    COL_NAME VARCHAR2(500);
    COL_VAL VARCHAR2(500);
BEGIN
    SELECT COUNT(*) INTO COL_TOTAL_NUM FROM user_tab_cols WHERE TABLE_NAME='PAY_SLIP_FEB_16';
    DBMS_OUTPUT.PUT_LINE('TOTAL COLUMN NUMBER = '||COL_TOTAL_NUM);
    FOR A IN 1..COL_TOTAL_NUM LOOP
      SAVEPOINT S1;
      SELECT COLUMN_NAME INTO COL_NAME FROM user_tab_cols WHERE TABLE_NAME='PAY_SLIP_FEB_16'
                                                  AND COLUMN_ID=A;
      EXECUTE IMMEDIATE 'SELECT '||COL_NAME||' FROM PAY_SLIP_FEB_16 WHERE EMP_ID=''FMINF83057'' AND '||COL_NAME||' IS NOT NULL' INTO COL_NAME;
      DBMS_OUTPUT.PUT_LINE(COL_NAME||' -> '||COL_VAL);
    END LOOP;
    EXCEPTION
      WHEN no_data_found THEN
        DBMS_OUTPUT.PUT_LINE('ERROR');
        ROLLBACK TO SAVEPOINT S1;
END;  

我的輸出是:

TOTAL COLUMN NUMBER = 117
EMP_ID -> FMINF83057
MONTH -> 2
YEAR -> 2016
NAME ->   Mr.Md.Mohiduzzaman
DESIGNATION -> Professor
DEPARTMENT -> Institute of Nutrition and Food Sciences
GRADE -> 2
BASIC_PAY -> 73720
HOUSE_RENT_ALLOWANCE -> 19750
MEDICAL_ALLOWANCE -> 700
ERROR  

for循環在此處停止。 發生錯誤后如何繼續?

遇到錯誤時,只需要使用CONTINUE語句即可。 從Oracle 11g起可以使用它。 但是,你需要做的循環。 我將您的異常部分移入了循環,並將其包含在一個塊中:

DECLARE
    COL_TOTAL_NUM NUMBER;
    COL_NAME VARCHAR2(500);
    COL_VAL VARCHAR2(500);
BEGIN
    SELECT COUNT(*) INTO COL_TOTAL_NUM FROM user_tab_cols WHERE TABLE_NAME='PAY_SLIP_FEB_16';
    DBMS_OUTPUT.PUT_LINE('TOTAL COLUMN NUMBER = '||COL_TOTAL_NUM);
    FOR A IN 1..COL_TOTAL_NUM LOOP
    BEGIN
      SAVEPOINT S1;
      SELECT COLUMN_NAME INTO COL_NAME FROM user_tab_cols WHERE TABLE_NAME='PAY_SLIP_FEB_16'
                                              AND COLUMN_ID=A;
      EXECUTE IMMEDIATE 'SELECT '||COL_NAME||' FROM PAY_SLIP_FEB_16 WHERE EMP_ID=''FMINF83057'' AND '||COL_NAME||' IS NOT NULL' INTO COL_NAME;
      DBMS_OUTPUT.PUT_LINE(COL_NAME||' -> '||COL_VAL);
    EXCEPTION
      WHEN no_data_found THEN
        DBMS_OUTPUT.PUT_LINE('ERROR');
        CONTINUE;                         --move to the next iteration of the loop
    END;
    END LOOP;
END; 

該語句告訴編譯器跳過循環的當前迭代,然后跳到下一個。 它對於記錄目的特別有用。

暫無
暫無

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

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