Триггер создан с ошибками компиляции.ORA-: отсутствует ключевое слово SELECT - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь создать триггер, который срабатывает после вставки / обновления и проверяет нулевые значения в нескольких столбцах.Если какой-либо из них имеет значение NULL, он запрашивает другие таблицы и обновляет текущую таблицу

CREATE OR REPLACE TRIGGER sample_trigger
 AFTER INSERT OR UPDATE
ON test_table
FOR EACH ROW
BEGIN
IF :NEW.ID IS NULL OR :NEW.CODE IS NULL
THEN    
  UPDATE (:NEW.ID,:NEW.CODE) = (SELECT T1.ID,
                                          T2.CODE
                                          FROM TABLE_1 T1
                                          JOIN TABLE_2 T2 ON T1.ID=T2.ID
                                          WHERE ID=:NEW.TEST_ID);                     

END IF;

END;
/

Warning: Trigger created with compilation errors.
ERROR: PL/SQL: ORA-00928: missing SELECT keyword

Ответы [ 2 ]

3 голосов
/ 19 сентября 2019

Вы не UPDATE псевдо-запись :new.Просто присвойте ему значения

SELECT t1.id, t2.code
  INTO :new.id, :new.code
  FROM table1 t1
       join table2 t2 on t1.id = t2.id
 WHERE id = :new.test_id

Пара дополнительных примечаний

  • Ваше предложение WHERE вызовет неоднозначную ошибку ссылки.Поскольку и t1, и t2 имеют столбец ID, вам необходимо указать, с каким столбцом таблицы вы сравниваете.
  • Если test_table совпадает с table_1 или table_2, это приведет к исключению мутирующей таблицы.
  • Ваш триггер должен быть BEFORE INSERT, поскольку он изменяет данные, а не AFTER INSERT триггер.
0 голосов
/ 19 сентября 2019

Триггеры должны следовать синтаксису, как любой другой программный модуль;UPDATE Вы написали недействительно (очевидно), но - вам это не нужно.Вот что вы могли бы сделать:

  • объявить две переменные, которые будут содержать значения ID и CODE
  • установить значения столбцов TEST_TABLES в эти переменные

CREATE OR REPLACE TRIGGER sample_trigger
  AFTER INSERT OR UPDATE
  ON test_table
  FOR EACH ROW
DECLARE
  l_id   test_table.id%type;
  l_code test_table.code%type;
BEGIN
  IF :NEW.ID IS NULL OR :NEW.CODE IS NULL
  THEN
    SELECT t1.id, t2.code
      INTO l_id , l_code
      FROM table_1 t1 JOIN table_2 t2 ON t1.id = t2.id
      WHERE id = :new.test_id;

    :new.id   := l_id;
    :new.code := l_code;

  END IF;
END;
/
...