创建的触发器存在编译错误。 ORA-:缺少 SELECT 关键字

Trigger created with compilation errors. ORA-:missing SELECT keyword

我正在尝试创建一个在 insert/update 之后触发的触发器,并检查几列中的空值。如果其中任何一个为 NULL,它会查询其他 tables 并更新当前的 table

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

您没有 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 子句将产生不明确的引用错误。由于 t1t2 都有一个 ID 列,因此您需要指定要与哪个 table 的列进行比较。
  • 如果 test_tabletable_1table_2 相同,将产生变异 table 异常。
  • 您的触发器应该是 BEFORE INSERT,因为它正在修改数据而不是 AFTER INSERT 触发器。

触发器必须像任何其他程序单元一样遵循语法; 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;
/