WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   oracle: frage zu exceptions in plSQL (http://www.wcm.at/forum/showthread.php?t=192663)

RaistlinMajere 30.05.2006 15:08

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;
/


RaistlinMajere 30.05.2006 15:43

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;


watchdog 05.06.2006 22:22

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

RaistlinMajere 07.06.2006 10:56

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.


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:05 Uhr.

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