cursor in einem trigger
Ich habe eine vorhandene TABELLE postn_matrix
enthält eine Liste der Mitarbeiter und eine Zählung Ihrer resp. Positionen in der organisation.
Wenn eine position von einem Benutzer Hinzugefügt oder entfernt wird, wird die entsprechende Anzahl spiegelt sich in der Tabelle thro' diesen Auslöser (VIA UPDATE)
Nun, wenn es ein neuer Benutzer ist, wird er nicht über einen Eintrag in postn_matrix
, so habe ich, um einen neuen Datensatz einzufügen, für ihn/Sie (ÜBER EINFÜGEN). Dies muss in Verbindung gebracht werden, aus der Basistabelle.
Das update scheint einwandfrei zu funktionieren, aber ich bin nicht in der Lage zu bringen, in der Sie einen neuen Benutzer in die Tabelle.
Habe ich versucht zu behandeln in diesem Fall mit einem cursor. Aber es nicht helfen, noch.
Ich hoffe, dass einige Experten konnten zeigen, mir das Licht.. :). alle anderen Vorschläge neben der Verwendung der cursor wird sehr geschätzt
CREATE OR REPLACE TRIGGER TRIG1
BEFORE INSERT OR DELETE ON (BASETABLE)
FOR EACH ROW
DECLARE
cursor c1 is
select person_id
from postn_matrix;
v_temp varchar2(15);
BEGIN
IF INSERTING THEN
open c1;
LOOP
fetch c1 into v_temp;
if v_temp!=:new.person_id THEN
insert into POSTN_MATRIX (PERSON_ID)
VALUES (:new.PERSON_ID);
else
UPDATE POSTN_MATRIX
//this is working fine ;
END IF;
end loop;
close c1;
END
/
- Ich verstehe es nicht. Wenn es ein neuer Datensatz ist in der BASETABLE und Sie wissen bereits, dass es keine Aufzeichnungen in POSTN_MATRIX, warum würden Sie wollen, um eine Schleife durch einen cursor auf POSTN_MATRIX? Legen Sie einfach einen neuen Datensatz.
- Bitte Holen Sie sich ein grundlegendes Buch über SQL und Lesen Sie es. Sie brauchen einen cursor, um dies zu tun, und darüber hinaus Ihre SQL sollte in der Regel nicht haben
if then
Aussagen in ihm. SQL ist eine Reihe orientierte Sprache. siehe codeproject.com/Articles/10144/SQL-as-a-set-oriented-language
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wegen der Schleife (die fehlt eine exit-Klausel - hoffentlich haben Sie nur verloren, dass die übersetzen dieses in einer Frage) sind Sie gehen, um zu versuchen, um einen Datensatz einfügen, in
pstn_matrix
für jeder Datensatz der cursor zurückgibt, ob es einen passenden:new.person_id
oder nicht; und wenn es übereinstimmt werden Sie auch tun, dieupdate
. Die wahrscheinlich nicht, was Sie wollen, und Sie könnten sich eine constraint-Verletzung unter anderem. Sie sind auch nicht die Einstellung Ihrer Zähler-Feld, wenn keine null-Werte zulässt, dann ist das der Fehler. Aber Sie haben nicht gesagt, was Fehler, wenn überhaupt, sind Sie immer.Wenn Sie müssen dies tun, durch einen trigger, dann kann man entweder schauen ob es eine neue Zeile für den neuen Menschen:
... oder nutzen Sie
merge
.Aber ich weiß nicht wie dieses Modell, und Sie sind der Einrichtung das Potenzial für die Daten-Abweichungen mit gleichzeitigen änderungen an der Basis-Tabelle. Das aufrechterhalten einer Zählung wie das ist nicht unbedingt so einfach, wie es scheint.
Ich würde bevorzugen in der Regel, um diese anzeigen, die immer up-to-date und muss nicht den Auslöser zu verkomplizieren:
Natürlich, ich könnte falsch oder zu kurz gedacht, was Ihre Basis-Tabelle(N) tut und was Sie brauchen
postn_matrix
für. Es scheint ein wenig trivial, um noch einen Blick. Wenn Sie getrennteperson
undperson_position
Tabellen, sagen, dann können Sie in einem outer-join, um zu sehen, wie Menschen ohne Position::new.person_id
. Wenn es gerade getan hastselect person_id into v_temp
dann, wenn es keine vorhandenen Datensätze, die Sie bekommen würdeORA-01403
, und wenn es mehr war, als man Sie erhalten würdeORA-02112
. Mitmax()
bedeutet, dass Sie immer genau eine Zeile; wenn es eine beliebige Anzahl von übereinstimmenden Datensätzen wird es mit der ID, sonst wird es null sein. Sie können auchcount()
und check für null oder nicht-null-Zeilen gefunden, wenn Sie feststellen, dass klarer.