Каков синтаксис для использования инструкции Select внутри триггера PL/SQL?

это то, что у меня в настоящее время есть:

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 имеет эту ошибку: PL / SQL: ORA-00923: from ключевое слово не найдено где ожидалось

3 ответов


1) должно быть что-то еще в вашем примере, потому что это, кажется, работает для меня

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) вы, вероятно, хотите объявить V_EMPLID как тип Person.PersonNum%TYPE, чтобы вы могли быть уверены в правильности типа данных и чтобы при изменении типа данных таблицы вам не нужно было изменять код.

3) я предполагаю, что вы знаете, что ваш триггер не может запрашивать или обновлять таблицу, в которой определен триггер (поэтому никаких запросов или вставок в someTable).


вы играете с лавой (а не только огнем) в своем триггере. DBMS_OUTPUT в триггере очень, очень плохо. Вы можете выдуть переполнение буфера в триггере, и вся транзакция будет снята. Хорошее отслеживание повезло, что вниз. Если необходимо выполнить поведение "вывод в консоль", вызовите процедуру автономной транзакции, которая записывает в таблицу.

триггеры довольно зло. Раньше они мне нравились, но сейчас их трудно запомнить. Они влияют на данные часто времена ведущие к мутирующим данным (страшно и не только потому, что Хэллоуин близок).

мы используем триггеры для изменения значения столбцов like .new: LAST_MODIFIED: = sysdate and .new: LAST_MODIFIED_BY: = пользователь. Вот и все.

никогда не позволяйте триггеру препятствовать завершению транзакции. Найди другой вариант.


Я бы никогда не использовал select statment в триггере. Вставить в таблицу, а не в select. Как только таблица уже существует, select into не работает в большинстве баз данных.