Каков синтаксис для использования инструкции 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 не работает в большинстве баз данных.