WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 30.05.2006, 15:08   #1
RaistlinMajere
Inventar
 
Registriert seit: 06.04.2001
Alter: 44
Beiträge: 2.343


Standard oracle: frage zu exceptions in plSQL

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.
RaistlinMajere ist offline   Mit Zitat antworten
Alt 30.05.2006, 15:43   #2
RaistlinMajere
Inventar
 
Registriert seit: 06.04.2001
Alter: 44
Beiträge: 2.343


Standard

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.
RaistlinMajere ist offline   Mit Zitat antworten
Alt 05.06.2006, 22:22   #3
watchdog
Newbie
 
Registriert seit: 14.10.2002
Beiträge: 3


Standard

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;
Sorry, is ab bissl lang geworden, hoffe es passt alles. Hab schon länger nix mehr mit PL/SQL gemacht.

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. ...
watchdog ist offline   Mit Zitat antworten
Alt 07.06.2006, 10:56   #4
RaistlinMajere
Inventar
 
Registriert seit: 06.04.2001
Alter: 44
Beiträge: 2.343


Standard

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.
RaistlinMajere ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:40 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag