Stored Procedure mit Exception Handling bei Delete

kindlicherkaiser

Benutzer
Beiträge
10
Hallo Forumsgemeinde,

ich möchte in einer Stored Procedure ein Delete machen, nachdem ein Parameter für a_per_no eingegeben wird. Gibt es den Parameter a_per_no nicht in der Tabelle, soll eine Exception ausgeführt werden. Leider funktioniert mein Versuch nicht. Was ist den Falsch?

Code:
create or replace procedure del
(a_per_no in Table.per_no%type)
is
begin
delete from TABLE
where per_no = a_per_no;
if SQL%ROWCOUNT = 0 then raise my_exception;
end if;
exception
when my_exception then dbms_output.put_line('no data found');
end del;
/

Besten Dank bereits für die Hilfe!
 
Werbung:
mir scheint, Du prüfst, ob die Spalte per_no = a_per_no ist, bzw. löscht die Records, die in diesen Spalten gleich sind. Ich weiß aber nicht, ob das wirklich das ist, was Du machen willst.
 
Hallo Akretschmer,

ich möchte in der Tabelle Table in der Artikelnummern (per_no) gespeichert sind, den Artikel löschen, den ich in den Parameter a_per_no eingebe. Wenn man eine Artikelnummer eingibt, die es in der Tabelle nicht gibt, soll eine Exception ausgeführt werden.

Vielen lieben Dank schonmal
 
ah okay, mein Fehler.

Hrm. PostgreSQL ist anders als Oracle...

Code:
test=*# create or replace function del(in my_number int) returns bool as $$begin delete from foo where c1 = my_number; if not found then raise exception 'no data found, bäääh'; end if; return true; end; $$language plpgsql;
CREATE FUNCTION
test=*# select * from foo;
 c1 | c2
----+----
  1 |  2
(1 Zeile)

test=*# select del(1);
 del
-----
 t
(1 Zeile)

test=*# select del(1);
FEHLER:  no data found, bäääh
KONTEXT:  PL/pgSQL-Funktion del(integer) Zeile 1 bei RAISE
test=*#

Ich sehe auf Anhieb nicht, was bei Dir falsch ist. Sorry.
 
Leider funktioniert mein Versuch nicht. Was ist den Falsch?
Das nenn ich mal ne ausführliche Fehlerbeschreibung :rolleyes:

Selbst definierte Exceptions müssen vorher definiert werden:
Code:
create or replace procedure del
(a_per_no in Table.per_no%type)
is
my_exception EXCEPTION;
PRAGMA EXCEPTION_INIT( my_exception, -20001 );
begin
delete from TABLE
where per_no = a_per_no;
if SQL%ROWCOUNT = 0 then
RAISE_APPLICATION_ERROR(-20001,'Nix gefunden');
end if;
exception ...

Wieso machst Du nicht gleich deine Ausgabe ohne den Umweg über eine Exception? Du gibst sie eh nicht an den Aufrufer weiter.
 
Hallo drdimitri,

vielen lieben Dank für die Antwort. Es funktioniert und hat mir sehr geholfen.

...aktuell versuche ich mich an einem Exception-Handling für Update Anweisungen.
Folgender Code ohne Exception Handling funktioniert.

Code:
CREATE OR REPLACE PROCEDURE up_gehalt(
      pernr IN hr.per_nr%TYPE,
      addgehalt IN hr.gehalt%TYPE)
IS
BEGIN
  UPDATE angestellter SET gehalt = (gehalt + addgehalt) where per_nr = pernr;
END;
/

....nachstehender mit Exception-Handling gibt einen Fehler aus.

Code:
CREATE OR REPLACE PROCEDURE up_gehalt(
       pernr IN hr.per_nr%TYPE,
       addgehalt IN hr.gehalt%TYPE)
IS
nopernr exception;
pragma exception_init(nopernr, -20000);
BEGIN
  UPDATE angestellter SET gehalt = (gehalt + addgehalt) where per_nr = pernr;
if sql%rowcount = 0 then raise_application_error(-20000, 'Nummer gibt's nicht');
end if;
END upsal_ang;
/

Woran liegts?

Vielen lieben Dank für Deine Hilfe.
...um ein Profi zu werden muss ich allerdings noch viel üben ;-)
 
Hallo drdimitri,

ok, ich versuchs mal.

Ich möchte mit execute up_gehalt(pernr, addgehalt) das Gehalt der eingegebenen Personalnummer um den eingegebenen Betrag erhöhen.

Wenn es die Personalnummer nicht gibt, soll eine Fehlermeldung kommen, die ausgibt, dass es diese Personalnummer in der Tabelle nicht gibt.

Code:
if sql%rowcount = 0 then raise_application_error(-20000, 'Nummer gibt's nicht');

Gibt es bei Update keine Exception wenn SQL%rowcount = =?
Code:
Error at line 1:
ORA-06550: line, column 7:
PLS-00905: object Nutzer.up_gehalt is invalid
ORA-06550: line, column 7:
PL/SQL: Statement ignored

Besten Dank schonmal
 
Das ist der Fehler wenn du die Procedur ausführen willst, weil diese invalid ist - sprich einen Fehler beinhaltet.
Der ursächliche Fehler (den du bei der Erstellung der Procedur bekommen aber ignoriert hast) lautet:
Code:
ORA-01756: Anführungsstrich fehlt bei Zeichenfolge
Das Hochkomma bei Nummer gibt's nicht beendet den String nach dem t. Wenn Du ein Hochkomma im String verwenden willst, dann musst du es mit zwei '' maskieren:
Code:
if sql%rowcount = 0 then raise_application_error(-20000, 'Nummer gibt''s nicht');end if;
 
Noch ein Tipp:
Wenn du einfach nur eine Exception werfen willst, dann reicht raise_application_error aus.
Du musst sie nicht vorher definieren, das ist nur nötig, wenn du in einem anderen PLSQL Programmteil auf diesen Namen zugreifen willst.

Da du hier nur lokale Variablen verwendest und kein Pakage hast, ist das nicht der Fall und Du kannst diese Zeilen getrost weglassen:
Code:
nopernr exception;
pragma exception_init(nopernr, -20000);
 
Werbung:
Zurück
Oben