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