2008-10-14 3 views
7

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

+0

В какой строке указывается эта ошибка? – 2008-10-14 20:43:49

+0

Первая ошибка в последовательности находится в строке «WHERE PERSONID ...». – Equistatic 2008-10-14 21:02:24

+0

Обновленный ответ, в вашем примере есть что-то еще, что не было опубликовано. Код, написанный для меня, работает. – 2008-10-14 21:14:17

ответ

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

-2

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

1

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^