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?
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
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. –