Quelle est la syntaxe pour utiliser une instruction Select dans un déclencheur PL / SQL?

StackOverflow https://stackoverflow.com/questions/202609

  •  03-07-2019
  •  | 
  •  

Question

Voici ce que j'ai actuellement:

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 a cette erreur: PL / SQL: ORA-00923: Mot clé FROM non trouvé où prévu

.
Était-ce utile?

La solution

1) Il doit y avoir autre chose à votre exemple car cela semble fonctionner pour moi

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) Vous voudrez probablement déclarer V_EMPLID comme étant de type Person.PersonNum% TYPE afin de vous assurer que le type de données est correct et que, si le type de données de la table change, vous ne devrez pas le faire. votre code.

3) Je suppose que vous savez que votre déclencheur ne peut ni interroger ni mettre à jour la table sur laquelle le déclencheur est défini (aucune requête ou insertion dans someTable).

Autres conseils

Vous jouez avec Lava (pas seulement le feu) dans votre détente. DBMS_OUTPUT dans un déclencheur est vraiment, vraiment mauvais. Vous pouvez faire sauter un buffer overflow dans votre déclencheur et toute la transaction est exécutée. Bonne chance pour le retrouver. Si vous devez adopter un comportement semblable à celui de la sortie de la console, appelez une procédure AUTONOMOUS TRANSACTION qui écrit dans une table.

Les déclencheurs sont assez diaboliques. Je les aimais bien, mais ils sont trop difficiles à retenir. Ils affectent souvent les données menant à la saisie de données (effrayantes et pas seulement parce que Halloween est proche).

Nous utilisons des déclencheurs pour modifier la valeur de colonnes telles que .new: LAST_MODIFIED: = sysdate et .new: LAST_MODIFIED_BY: = user. C'est ça.

Ne laissez jamais un déclencheur empêcher une transaction de se terminer. Rechercher une autre option.

Je n’utiliserais jamais une instruction select dans un déclencheur. Insérer dans la table plutôt qu'une sélection dans. Une fois que la table existe déjà, select into ne fonctionne pas dans la plupart des bases de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top