В этом скрипте гораздо более серьезная проблема, чем ошибка, которую вы получаете. Даже после исправления, предложенного @ShaunPeterson, он все равно не будет работать, он НЕ БУДЕТ выдавать ошибку, он просто не будет работать так, как вы ожидаете. Проблема в том, что вы не поняли переменные подстановки - использование & name (в частности, здесь & Birthday.) Я буду использовать & Birthday в следующем, но обсуждение относится к ЛЮБЫМ / ВСЕМ переменным подстановки.
люди не понимают, почему они не могут использовать переменные подстановки "&" в своих процедурах и функциях PL / SQL для запроса ввода во время выполнения. Надеемся, что эта статья поможет вам прояснить, в чем заключаются различия, чтобы вы могли понять, где и когда их использовать.
- Переменные подстановки Подсказка здесь в названии ... "подстановка". Это относится к значениям, подставляемым в код перед его отправкой в базу данных. Эти замены выполняются используемым интерфейсом
Эффект этой замены заключается в том, что строка , содержащая переменную подстановки, физически переписывается интерфейсом, заменяющим% Birthday , В этом случае, если вы не введете значение или дату 2000-05-19, оператор до и после подстановки будет
- ДО: V_Geburtsdatum: = ('& Birthday');
- ПОСЛЕ: V_Geburtsdatum: = (''); ИЛИ V_Geburtsdatum: = ('2000-05-19');
В любом случае после того, что видит компилятор после; он вообще не видит% Birthday. Более того, при запуске триггер не будет запрашивать значение. Что касается компилятора, это жестко закодированное значение, которое никогда не изменится. Помимо этого, триггер или любой другой сценарий PL SQL (сохраненный или анонимный) никогда не запрашивает значения , они фактически не способны сделать это, поскольку это не является частью языка. Любая подсказка через ваш интерфейс программного обеспечения не PL sql.
Я собираюсь предложить способ вообще избежать триггера. Начало работы soap box: Триггеры ПЛОХО, они полезны для назначения ключей автоматического увеличения (до 12 c), ведения журнала, очень ограниченного аудита и т. Д. c. Однако для бизнес-правил они должны быть последним средством. Ok Выйти из soap коробки.
Прежде всего, чтобы столбцы meine_Firma.Hiredate и meine_Firma.Geburtsdatum НЕ были равны нулю (если это еще не сделано). Если любой из них равен NULL, вы не можете ничего с ним вычислить, результатом будет NULL. Во-вторых, создайте новый столбец age_at_hire (или любой другой) в качестве виртуального столбца, затем установите для него ограничение проверки. И вуаля триггер больше не нужен. См. fiddle для демонстрации.
Итак, предлагаемое изменение (ДА, вам, вероятно, придется сначала очистить плохие данные):
alter table meine_Firma modify
( hiredate not null
, Geburtsdatum not null
) ;
alter table meine_Firma add
( age_at_hire integer generated always as (trunc(months_between(hiredate,Geburtsdatum))) virtual
, constraint check_age_at_hire check (age_at_hire >= 16*12)
);
В любом случае, я надеюсь, что вы получите понимание переменных подстановки на будущее. И учитесь избегать триггеров. Удачи.