![]() |
![]() |
|
![]() |
![]() |
|
Programmierung Rat & Tat für Programmierer |
![]() |
|
Themen-Optionen | Ansicht |
![]() |
#1 |
Inventar
![]() Registriert seit: 06.04.2001
Alter: 44
Beiträge: 2.343
|
![]() wenn eine vordefinierte exception, z.b. NO_DATA_FOUND geworfen wird, bezieht sich das ja nehme ich an immer auf das erste vorkommnis dieses fehlers.
was ist aber nun, wenn ich danach noch abfragen habe, die auch so einen fehler werfen könnten? woher kann ich wissen, wer bei mehreren statements jetzt dafür verantwortlich war, wenn eine exception geworfen wurde? oder ists generell besser, deswegen auf vordefinierte exceptions zu verzichten und lieber selbst welche zu definieren, wo´s dann klar ist, wer was geworfen hat? zur besseren vorstellung: Code:
BEGIN select * from bla1 where x='y'; select * from bla2 where x='z'; EXCEPTION when NO_DATA_FOUND then dbms_output.put_line('nix gefunden'); -- woher weiß ich, wer die jetzt geworfen hat? END; /
____________________________________
"Life is like a box of rockets," said the Marine. "You never know what you´re gonna ret." Then he pulled the trigger of his BFG9000. |
![]() |
![]() |
![]() |
#2 |
Inventar
![]() Registriert seit: 06.04.2001
Alter: 44
Beiträge: 2.343
|
![]() ok, ich weiß mittlerweile, daß ich mir über SQLCODE den oracle-errorcode holen kann, so daß ich sehen kann, welches statment ggf. die exception geworfen hat.
eine frage bleibt allerdings noch offen: werfen an sich kann sie jedes statement, oder? also da wird nicht unterschieden, das muß ich wenn schon selbst machen. z.b. Code:
DECLARE succ1 boolean; succ2 boolean; succ1:=false; succ2:=false; BEGIN select * from bla1 where x='y'; succ1:=true; select * from bla2 where x='z'; succ2:=true; EXCEPTION when NO_DATA_FOUND then IF NOT succ1 dbms_output.put_line('in bla1 nix gefunden'); ELSE dbms_output.put_line('in bla2 nix gefunden'); END IF; END;
____________________________________
"Life is like a box of rockets," said the Marine. "You never know what you´re gonna ret." Then he pulled the trigger of his BFG9000. |
![]() |
![]() |
![]() |
#3 |
Newbie
![]() Registriert seit: 14.10.2002
Beiträge: 3
|
![]() Punkt 1: In nem PL/SQL-Block musst jedenfalls in ne Variable oder in nen Record selektieren, sonst wird das nix. Das Ergebnis muss ja irgendwo rein ;-). Nachdem ja evt. mehr als 1 Record zurückkommen kann, solltest du einen cursor bzw. ne cursor-for-loop verwenden.
Zu Deinem Prob: Also ich würde sagen, Du machst es entweder mit flags so wie du's vorgeschlagen hast oder du machst Unterblöcke Code:
DECLARE v_succ varchar2(5) := 'START'; v_result varchar2(1); cursor c1 is select '1' from dual; BEGIN ---------------------- -- Sub-Programmblock 1 ---------------------- BEGIN select '*' into v_result from bla1 where x='y'; EXCEPTION when NO_DATA_FOUND then dbms_output.put_line('in bla1 nix gefunden'); END; --> Weiter in der Verarbeitung ---------------------- -- Sub-Programmblock 2 ---------------------- BEGIN select '*' into v_result from bla2 where x='z'; EXCEPTION when NO_DATA_FOUND then dbms_output.put_line('in bla2 nix gefunden'); END; --> Weiter bei der restlichen Verarbeitung ------------------------------------ -- NO_DATA_FOUND => äußere Exception ------------------------------------ v_succ := 'bla3'; select * into v_result from bla3 where x='z'; ------------------ -- cursor-Beispiel ------------------ open c1; fetch c1 into v_result; if c1%FOUND then dbms_output.put_line('Gefunden: '||v_result); else -- c1%NOTFOUND dbms_output.put_line('Nix gefunden'); -- Wenn gewünscht hier definierten Fehler raisen end if; close c1; EXCEPTION when NO_DATA_FOUND then dbms_output.put_line('Programmabbruch no_data_found bei: '||v_succ); when OTHERS then dbms_output.put_line('Undefinierter Verarbeitungsfehler: '||SQLERRM); END; Kommt halt drauf an was du brauchst (weiter in Verarbeitung oder abbrechen). Natürlich kann man auch alles auslagern, zentral abfangen, mit cursor-Attributen (found, notfound) lösen - mehrere Ergebnisse cursor-for-loop, usw. ... |
![]() |
![]() |
![]() |
#4 |
Inventar
![]() Registriert seit: 06.04.2001
Alter: 44
Beiträge: 2.343
|
![]() hi,
daß man unterblöcke bilden kann, war mir nicht bekannt, das wäre natürlich auch eine elegante möglichkeit der lösung. danke für deine antwort.
____________________________________
"Life is like a box of rockets," said the Marine. "You never know what you´re gonna ret." Then he pulled the trigger of his BFG9000. |
![]() |
![]() |
![]() |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|