Каков синтаксис для использования оператора Select внутри PL / SQL Trigger? - PullRequest
8 голосов
/ 15 октября 2008

Это то, что у меня сейчас есть:

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 ]

6 голосов
/ 15 октября 2008

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 голос
/ 15 октября 2008

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

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

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

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

0 голосов
/ 15 октября 2008

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

...