[英]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.