Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Stored Procedure mit Exception Handling bei Delete

Dieses Thema im Forum "Oracle" wurde erstellt von kindlicherkaiser, 1 Juni 2017.

  1. kindlicherkaiser

    kindlicherkaiser Benutzer

    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!
     
  2. akretschmer

    akretschmer Datenbank-Guru

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

    kindlicherkaiser Benutzer

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

    akretschmer Datenbank-Guru

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

    drdimitri Datenbank-Guru

    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.
     
    akretschmer gefällt das.
  6. kindlicherkaiser

    kindlicherkaiser Benutzer

    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 ;-)
     
  7. drdimitri

    drdimitri Datenbank-Guru

    Zu allererst musst Du mal lernen, Fehlermeldungen zu posten. Die sagt dir genau woran es liegt.
     
  8. kindlicherkaiser

    kindlicherkaiser Benutzer

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

    drdimitri Datenbank-Guru

    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;
     
  10. kindlicherkaiser

    kindlicherkaiser Benutzer

    ....oh je, wie konnte mir das passieren ;-) und das als erfahrenen VBA Programmierer, der solche Kleinigkeiten doch kennt.

    nichtsdestotrotz besten Dank!
     
  11. drdimitri

    drdimitri Datenbank-Guru

    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);
     
  12. kindlicherkaiser

    kindlicherkaiser Benutzer

    ok, Danke. Dein Tip hilft mir sehr weiter.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden