Каков синтаксис использования оператора 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 не найдено, где ожидалось

sql,oracle,plsql,ora-00923,

8

Ответов: 3


6 ов принято

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).


1

Вы играете с лавой (а не только огнем) в своем триггере. DBMS_OUTPUT в триггере действительно, очень плохо. Вы можете продувать переполнение буфера в триггере, и вся транзакция будет снята. Удачи проследить за этим. Если вы должны выполнить поведение типа «выход-на-консоль», вызовите процедуру AUTONOMOUS TRANSACTION, которая записывает в таблицу.

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

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

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


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

SQL, Oracle, PLSQL, ор-00923,
Похожие вопросы