Итак, я хочу создать этот триггер, но я продолжаю получать ошибку ORA-00922 и не могу найти исправление.
CREATE OR REPLACE TRIGGER employee_briu
BEFORE INSERT OR UPDATE ON employee
FOR EACH ROW
BEGIN
SET :NEW.first_name = TRIM(:NEW.first_name);
SET :NEW.last_name = TRIM(:NEW.last_name);
SET :NEW.id = UPPER(:NEW.id);
END employee_briu;
Журнал ошибок:
LINE/COL ERROR
--------- -------------------------------------------------------------
2/5 PL/SQL: SQL Statement ignored
2/9 PL/SQL: ORA-00922: missing or invalid option
3/5 PL/SQL: SQL Statement ignored
3/9 PL/SQL: ORA-00922: missing or invalid option
4/5 PL/SQL: SQL Statement ignored
4/9 PL/SQL: ORA-00922: missing or invalid option
Хм . . . Я бы написал это как:
BEGIN
SELECT TRIM(:NEW.first_name), TRIM(:NEW.last_name), UPPER(:NEW.id)
INTO :NEW.first_name, :NEW.last_name, :NEW.id
FROM dual;
END employee_briu;
Что это за "ОТ дуала"? Спасибо за ответ.
@Хайдрекс. . . Oracle требует пункт FROM
. Когда вы хотите написать запрос, которого в противном случае не было бы, используется dual
.
Так что я могу в принципе назвать это как угодно правильно?
@Хайдрекс. . . Нет. Вам нужна таблица, в которой гарантированно будет ровно одна строка. Эта таблица в Oracle — dual
(на самом деле это другие системные таблицы, которые соответствуют требованиям, но это стандарт Oracle).
Однако любой оператор select into
будет менее эффективным, чем простое присвоение переменной.
Как описано в руководстве, присваивание выполняется с помощью :=
в PL/SQL. Для этого нет команды SET
.
CREATE OR REPLACE TRIGGER employee_briu
BEFORE INSERT OR UPDATE ON employee
FOR EACH ROW
BEGIN
:NEW.first_name := TRIM(:NEW.first_name);
:NEW.last_name := TRIM(:NEW.last_name);
:NEW.id := UPPER(:NEW.id);
END employee_briu;
/
Я удалил конфликтующие теги базы данных. Пожалуйста, не спамьте теги несвязанными базами данных (предположительно, чтобы привлечь больше читателей)