Frage

Das ist, was ich derzeit haben:

CREATE OR REPLACE TRIGGER MYTRIGGER
AFTER INSERT ON SOMETABLE
FOR EACH ROW    

DECLARE
 v_emplid varchar2(10);    

BEGIN
 SELECT
  personnum into v_emplid
 FROM PERSON
 WHERE PERSONID = :new.EMPLOYEEID;

dbms_output.put(v_emplid);

/* INSERT INTO SOMEOTHERTABLE USING v_emplid and some of the other values from the trigger table*/

END MYTRIGGER;    

DBA_ERRORS hat diesen Fehler: PL / SQL: ORA-00923: Schlüsselwort FROM nicht an erwarteter Stelle gefunden

War es hilfreich?

Lösung

1) Es muss etwas anderes zu Ihrem Beispiel sein, weil das sicher scheint für mich zu arbeiten

SQL> create table someTable( employeeid number );

Table created.

SQL> create table person( personid number, personnum varchar2(10) );

Table created.

SQL> ed
Wrote file afiedt.buf

  1  CREATE OR REPLACE TRIGGER MYTRIGGER
  2    AFTER INSERT ON SOMETABLE
  3    FOR EACH ROW
  4  DECLARE
  5   v_emplid varchar2(10);
  6  BEGIN
  7   SELECT personnum
  8     into v_emplid
  9     FROM PERSON
 10    WHERE PERSONID = :new.EMPLOYEEID;
 11    dbms_output.put(v_emplid);
 12    /* INSERT INTO SOMEOTHERTABLE USING v_emplid and some of the other values
 from the trigger table*/
 13* END MYTRIGGER;
 14  /

Trigger created.

SQL> insert into person values( 1, '123' );

1 row created.

SQL> insert into sometable values( 1 );

1 row created.

2) Sie wahrscheinlich V_EMPLID als Typ Person.PersonNum% TYPE deklarieren möchten, so dass Sie sicher sein können, dass der Datentyp korrekt ist, und so, dass, wenn der Datentyp der Tabelle ändert werden Sie nicht ändern müssen Ihr Code.

3) Ich gehe davon aus, dass Sie wissen, dass Ihr Trigger nicht die Tabelle abzufragen oder aktualisieren, auf das der Trigger definiert ist (also keine Anfragen oder Einfügungen in sometable).

Andere Tipps

Sie spielen mit Lava (nicht nur Feuer) in dem Trigger. DBMS_OUTPUT in einem Trigger ist wirklich, wirklich schlecht. Sie können auf einen Pufferüberlauf in der Trigger-Blow-out und die gesamte Transaktion wird geschossen. Viel Glück verfolgt, mit nach unten. Wenn Sie eine Ausgabe-to-Konsole Verhalten tun müssen, rufen Sie ein autonomes TRANSACTION Verfahren, das zu einer Tabelle schreibt.

Trigger sind ziemlich böse. Ich habe sie mögen, aber sie sind zu schwer merken zu. Sie beeinflussen Daten oft die zu mutierenden Daten (beängstigend und nicht nur, weil Halloween nah ist).

Wir Trigger verwenden Sie den Wert von Spalten wie .new zu ändern: LAST_MODIFIED: = sysdate und .new: LAST_MODIFIED_BY: = user. Das ist es.

Lassen Sie nicht immer ein TRIGGER eine Transaktion zu verhindern, abgeschlossen wird. Finden Sie eine andere Option.

Ich würde nicht eine select-Anweisung in einem Trigger jemals verwenden. Legen Sie in der Tabelle anstatt eine select into. Nachdem bereits die Tabelle auswählen existiert in nicht funktioniert in den meisten Datenbanken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top