Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Exception Handling PL/SQL (Achtung, lang) :-)

Empfohlene Antworten

Veröffentlicht

Hallo zusammen,

ich habe hier folgendes Problem:

Ich habe mir einen EXCEPTION zusammengestickt und bekomme nun eine für mich seltsame Code-Ausführung (Code hier vereinfacht):

OPEN Cursor(Variable);

     LOOP

        FETCH Cursor INTO Number1, Number2;

        EXIT WHEN Cursor%NOTFOUND;                

              BEGIN

                SELECT ID 

                INTO numID

                FROM Tabelle

                WHERE a=Variable;


                Prozedur_Verabeite_was(Variable,numID,1);


             --------------------------------------------------  

              EXCEPTION

                -- || Wenn kein Datensatz gefunden wurde

                WHEN NO_DATA_FOUND

                THEN

                  IF (TriggerFlag = 0) THEN

                       SAVEPOINT trans1;

                  END IF;

                  Dp_GetNextNoForAttributeID (350240252, NextInt4No, 0, TriggerFlag);

                  IF (NextInt4No <= 0) THEN

                    IF(TriggerFlag = 0) THEN

                        ROLLBACK TO trans1;

                    END IF;

                    wfms_Raiserror (30009, 0, 0, meine_Tabelle');

                  ELSE

                      SELECT Name

                      INTO  varName

                      FROM Tabelle_Namen

                      WHERE ID = Variable;


                       INSERT INTO meine_Tabelle(ID)

                       VALUES   (ID);


                  END IF;


                 WHEN TOO_MANY_ROWS

                  THEN

                   Prozedur_Verabeite_was(Variable,numID,0);              

              END;         

     END LOOP;

     CLOSE Cursor; 

So, nun habe ich folgendes Problem:

Er findet bei meinem obersten SQL-Statement genau einen Datensatz und kommt dadurch weder durch NO_DATA_FOUND noch mit TOO_MANY_ROWS in meine Ausnahmehandlung.

Was er nun macht ist, dass er meine Prozedur Prozedur_Verabeite_was(Variable,numID); ausführt. Soweit in Ordnung.

Aber nun kommt das komische. Nachdem er die Prozedur ausgeführt hat, springt er in den Ausnahmeabschnitt in die Zeile:

IF (TriggerFlag = 0) THEN....

und macht ein Insert, obwohl er nicht sollte.

Frage:

Kann PL/SQL immer nur genau ein Statement in einer Ausnahme bearbeiten?

In meinen Büchern und in weiteren Online Dokus find ich nämlich dann immer nur noch ein Statement.

Also etwas sowas:

WHEN NO_DATA_FOUND

THEN

dbms_output.put_line('Nix gefunden');

WHEN TOO_MANY_ROWS

THEN

dbms_output.put_line('Zuviel gefunden');

END;

Gruß

Ganymed

Hi,

in einer Exception können immer mehrere Statements abgearbeitet werden.

Wenn er in deine "no_data_found" Exception

springt, heisst das, dass deine Prozedur_verarbeite_was(..) diese Exception auslöst, bzw. das diese Exception nicht innerhalb der Prozedur verarbeitet wird...

In der Hoffnung, geholfen zu haben,

Axl

Ein Exception Handler besteht aus einer Reihe von Statements, die ausgeführt werden, wenn ein bestimmter Fehler auftritt. Welche und wieviele Statements ausgeführt werden sollen, ist dem Programmierer überlassen. Wenn in diesen Statements Variablen angesprochen werden, muß ihr Gültigkeitsbereich berücksichtiigt werden.

Ebenso wird vom Programmierer festgelegt, für welche Fehler eine Fehlerbehandlung stattfinden soll. Sobald für einen bestimmten Fehler ein Exception Handler definiert ist, wird dieser beim Auftreten des Fehlers automatisch angesprungen und die dortigen Statements werden ausgeführt.

Wenn in einem Block ein bestimmter Fehler auftritt, für den in diesem Block kein zugehöriger Exception Handler definiert ist, wird der darüberliegenede Block nach dem zugehörigen Exception Handler durchsucht. Dies wird solange wiederholt, bis entweder in einem darüberliegenden Block ein passender Exception Handler gefunden und ausgeführt wurde, oder anderenfalls, wenn kein passender Exception Handler vorhanden ist, eine explizite Fehlermeldung - UNHANDLED EXCEPTION ...... - ausgegeben und das Pl/SQL Programm abgebrochen wird.

Hoffe das hat dir ein wenig geholfen

  • Autor

Super!

Es war tatsächlich meine Unterprozedur die nen Fehler hatte, und deswegen ist er in die Exception gesprungen.

Ist ja interssant, dass der Exeption-Block so wirkt. :)

Vielen Dank, jetzt kann ich meinen Fehler da suchen :) (oder eher :()

Gruß

Gany

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.