ВАУ, Вы хотите, чтобы в вашем триггере была только ОДНА вставка, чтобы избежать чего?
"У меня есть один оператор вставки INSERT INTO HIST (EMP_ID, NAME) VALUES (: NEW.EMP_ID,: NEW.NAME); при удалении я хочу использовать: OLD, не иметь отдельного вставить заявление для этого. "
Это широкий стол. ТАК? В текстовых редакторах нет ЗАМЕНЫ, вы не собираетесь писать вставку снова, просто скопируйте, вставьте, выберите, замените: НОВЫЙ на: СТАРЫЙ.
У Тони есть решение, но я серьезно сомневаюсь, что оно работает лучше, чем 2 вставки.
В чем дело?
EDIT
главное, чего я пытаюсь избежать, - это управлять двумя вставками при изменении таблицы. - Мэтью Уотсон
Я постоянно сражаюсь с таким отношением. Те, кто пишет Java, C ++ или .Net, имеют встроенный RBO ... Делайте это, это хорошо. Не делай этого, это плохо. Они пишут код в соответствии с этими правилами, и это нормально. Проблема в том, что эти правила применяются к базам данных. Базы данных ведут себя не так, как код.
В мире кода иметь практически одинаковый код в двух «местах» - это плохо. Мы избегаем этого. Можно было бы абстрагировать этот код от функции и вызывать его из двух мест, чтобы избежать его повторного обслуживания, возможно, пропуская его и т. Д. Все мы знаем детали.
В этом случае, хотя true , в конце я рекомендую две вставки, они разделены ELSE. Вы не поменяете одно и не забудете другое. Это прямо там . Это не в другом пакете, или в каком-то скомпилированном коде, или даже где-то еще в том же триггере. Они находятся рядом друг с другом, есть ELSE и вставка повторяется с: NEW, а не: OLD. Почему я так без ума от этого? Это действительно имеет значение здесь? Я знаю, что две вставки не будут хуже других идей, и это может быть лучше.
Настоящая причина готовится к тем временам, когда это имеет значение. Если вы избегаете двух вставок ради технического обслуживания, вы упустите время, когда это будет ОГРОМНОЕ различие.
INSERT INTO log
SELECT * FROM myTable
WHERE flag = 'TRUE'
ELSE -- column omitted for clarity
INSERT INTO log
SELECT * FROM myTable
WHERE flag = 'FALSE'
Некоторые, включая Мэтью, сказали бы, что это плохой код, есть две вставки. Я мог бы легко заменить «ИСТИНА» и «ЛОЖЬ» переменной связывания и перевернуть ее по желанию. И это то, что сделает большинство людей. Но если True равен 0,1% значений, а 99,9% - False, вам нужны две вставки, потому что вам нужны два плана выполнения. Один лучше с индексом, а другой - FTS. Итак, да, у вас есть две вставки для обслуживания. Это не всегда плохо, и в этом случае это хорошо и желательно.