Почему я получаю сообщение ORA-00922 при попытке создать этот триггер?

Итак, я хочу создать этот триггер, но я продолжаю получать ошибку 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

Я удалил конфликтующие теги базы данных. Пожалуйста, не спамьте теги несвязанными базами данных (предположительно, чтобы привлечь больше читателей)

a_horse_with_no_name 10.12.2020 15:37
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
286
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Хм . . . Я бы написал это как:

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;

Что это за "ОТ дуала"? Спасибо за ответ.

Haidrex 10.12.2020 15:31

@Хайдрекс. . . Oracle требует пункт FROM. Когда вы хотите написать запрос, которого в противном случае не было бы, используется dual.

Gordon Linoff 10.12.2020 15:34

Так что я могу в принципе назвать это как угодно правильно?

Haidrex 10.12.2020 15:35

@Хайдрекс. . . Нет. Вам нужна таблица, в которой гарантированно будет ровно одна строка. Эта таблица в Oracle — dual (на самом деле это другие системные таблицы, которые соответствуют требованиям, но это стандарт Oracle).

Gordon Linoff 10.12.2020 15:36

Однако любой оператор select into будет менее эффективным, чем простое присвоение переменной.

William Robertson 10.12.2020 16:04
Ответ принят как подходящий

Как описано в руководстве, присваивание выполняется с помощью := в 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;
/

Другие вопросы по теме