2016-05-06 3 views
1

Я пытаюсь создать триггер, который при удалении строки из таблицы, она будет вставлена ​​в другой таблице:SQL на Delete Trigger

1 Create Or Replace Trigger cancel 
    2 After Delete 
    3   On OrderTable 
    4   For EACH ROW 
    5 Begin 
    6   Insert Into CancelledOrders Values (:old.acctNum, age, phone) 
    7   From OrderTable Natural Join Customer 
    8   Where acctid = :old.acctNum AND menuid = :old.menuNum; 
    9 End; 
10/
11 Show Errors; 

Я хочу, чтобы захватить acctNum, age и phone. acctNum из таблицы заказов, но age и phone из таблицы Заказчика. Поэтому я присоединяюсь к двум таблицам (по ключу acctid). Таким образом, присоединился результат будет выглядеть следующим образом:

acctNum Age Phone

Я получаю эту ошибку, когда я пытаюсь скомпилировать Trigger:

2/2 PL/SQL: SQL Statement ignored 
3/2 PL/SQL: ORA-00933: SQL command not properly ended 

Кто-нибудь знает эту проблему?

EDIT: Структура таблицы:

OrderTable: AcctNum MenuNum startOrder endOrder
клиентов Таблица: AcctNum age phone

ответ

3

Вы смешиваете в values and select (subquery) syntax, которые для разных вещей. Вы можете вставить из запроса, который использует значение из :old pseudorecord и значение из таблицы клиентов:

Insert Into CancelledOrders -- (acctNum, age, phone) 
    Select :old.acctNum, age, phone 
    From Customer 
    Where acctNum = :old.acctNum; 

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

+0

В 'where', где вы делаете': old.acctNum' относится только к таблице, где строки были удалены правильно? Он знает таблицу, из которой строки были удалены? – CapturedTree

+1

@ 1290 - ': old' относится к псевдозапуску, так как это триггер' для каждой строки '. Таким образом, он будет использовать значение формы строки, которая удаляется, да. Он не запрашивает эту таблицу напрямую. О, подождите, да, но это не должно быть, мне нужно это исправить - можете ли вы добавить структуры таблицы к вопросу, чтобы я мог видеть, что происходит от каждого? –

+0

О, я вижу сейчас. Но так как я присоединился к таблицам, удаленная строка (из OrderTable) будет соединена из другой строки в таблице Customer. Таким образом, в основном старые будут ссылаться на эту комбинированную строку с удалёнными значениями из таблицы заказов. – CapturedTree

1

Добавленное утверждение неверно. Вам нужно указать столбцы, которые вы хотите выбрать в таблицах.

Добавить пункт select в инструкцию для вставки. Кроме того, удалены values ключевых слов и указать имена столбцов:

Insert Into CancelledOrders (acctNum, age, phone) 
    Select :old.acctNum, age, phone 
    From OrderTable Natural Join Customer 
    Where acctid = :old.acctNum AND menuid = :old.menuNum; 
+0

Спасибо! Теперь это сработало! – CapturedTree