2016-03-28 14 views
0

Meine Aufgabe ist es, die Gesamtzahl der Spalten meiner Tabelle zu drucken. Dann für eine spezifische ID, drucken Sie nur den Namen dieser Spalten, der Wert hat (wenn eine Spalte Null für diese spezifische ID enthält, dann überspringen Sie sie). Ich verwende EXECUTE IMMEDIATE in meinem Code in einem FOR LOOP. Wenn EXECUTE IMMEDIATE keine Daten in einer Spalte gefunden hat, dann wirft es no_data_exception, was ich verarbeiten kann, aber ich kann meine Schleife nach dieser Ausnahme nicht fortsetzen.Ausnahmebehandlung mit FOR LOOP und EXECUTE IMMEDIATE

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; 

Meine Ausgabe ist:

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 

Die for-Schleife hier aufhört. Wie mache ich nach diesem Fehler weiter?

+0

Sie wollen also 'ERROR' drucken und wollen FOR LOOP weiter machen? Wenn dies der Fall ist, können Sie das tun, aber die Schleife beginnt von vorne, wenn Sie den Befehl 'ROLLBACK' haben. – Hawk

+0

Ich brauche keinen Fehler zu drucken. Ich habe es ausgedruckt, um sicherzustellen, dass ich mit der Ausnahme umgehen kann. Ich muss es einfach überspringen und die Schleife fortsetzen. –

Antwort

0

Sie müssen nur CONTINUE Anweisung verwenden, wenn Sie auf den Fehler stoßen. Es ist ab Oracle 11g verfügbar. Aber Sie müssen das innerhalb der Schleife tun. Ich zog die Ausnahme Teil innerhalb der Schleife, und eingeschlossen es in einem Block:

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; 

Die Aussage der Compiler sagt die aktuelle Iteration der Schleife und springt zu dem folgenden zu überspringen. Es ist besonders nützlich für die Protokollierung.

+1

Ich konnte die Ausnahme innerhalb der for-Schleife nicht verwenden, da ich sie nicht innerhalb eines Blocks eingeschlossen habe, aber nachdem ich die Schleife jetzt eingeschlossen habe, kann ich sie verwenden, vielen Dank. –