Announcement

Collapse
No announcement yet.

mein allererster Cursor

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • mein allererster Cursor

    Hallo,

    ich habe folgenden Trigger geschrieben der einen Cursor beinhaltet...



    Code:
    create or replace
    TRIGGER OP_LEITUNG
    BEFORE INSERT OR UPDATE OF ALS_LEITER ON IST_BETEILIGT
    FOR EACH ROW
    
    DECLARE
    x NUMBER;
    y NUMBER;
    CURSOR curs IS SELECT ARZT_STATUS_ID, als_leiter FROM IST_BETEILIGT;
    BEGIN
    OPEN curs;
    
    LOOP
    FETCH curs INTO x,y;
    EXIT WHEN curs%NOTFOUND;
    IF x = 3
    THEN RAISE_APPLICATION_ERROR(-20000,'Assistenzärzte dürfen keine OP leiten');
    END IF;
    END LOOP;
    CLOSE curs;
    Er soll durch alle Datensätze gehen bis die Tabelle zu Ende ist oder er auf den Wert '3' in der Spalte ARZT_STATUS_ID stößt, dann soll er einen Error ausgeben...

    Er wird fehlerfrei kompiliert...

    Wenn ich meine Tabelle aktualisiere oder einen neuen Datensatz einfüge, so dass ARZT_STATUS_ID = 3 dann wird kein Error ausgegeben.

    Wo liegt der Fehler?

  • #2
    Wo soll ich anfangen? Es gibt jede Menge technischer und fachlicher Fehler.
    Ich fang mal bei den technischen an:
    1. Du verwendest einen Cursor obwohl Du ein normales SQL verwenden kannst
    2. Du selektierst in einem Row Level Trigger auf die eigene Tabelle. Stichwort Mutating Table.


    Zum 1. Punkt: Verwende nie einen Cursor wenn Du ein normales SQL verwenden kannst. Und verwende nie eine Schleife wenn Du mit einer WHERE Bedingung das Ergebnis sofort geliefert bekommst.
    Zum 2. Punkt:Das hatten wir doch alles schon mal oder?


    Jetzt die fachlichen Fehler
    1. Du versteckst fachliche Logik in einem Trigger. (Auch das kommt mir bekannt vorl)
    2. Du suchst in einem BEVORE Trigger nach Werten, die in der Tabelle noch gar nicht sein können.
    3. Assistenzärzte dürfen laut deiner Abfrage prinzipiell nicht an OPs teilnehmen
    4. Dein Datenmodell ist nicht ganz optimal. Der Status gehört zu einer Person nicht zu einem Teilnehmer.


    Zum 1. Punkt: da kannst dich sicherlich noch an die Diskussion vor einigen Tagen erinnern. Ich kann nur sagen, dass alle Probleme die Du bisher hier gepostet hast (technisch gesehen) nur daran lagen, dass Du einen Trigger verwendet hast.
    Der 2. Punkt sollte klar sein. Du brauchst überhaupt kein SELECT sondern musst einfach :new.ARZT_STATUS_ID abfragen
    Beim 3. Punkt hast Du übersehen, dass Du die Kombination von Leiter und Status abfragen musst.
    Zum 4 Punkt: Der Status gehört eigentlich einer Entität Mitarbeiter. Genauso wie z.B. das Geburtsdatum oder das Geschlecht. In einer Zuordnungstabelle hat er nichts zu suchen.

    Dim
    Zitat Tom Kyte:
    I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

    Comment

    Working...
    X