创建的触发器存在编译错误。 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
子句将产生不明确的引用错误。由于 t1
和 t2
都有一个 ID
列,因此您需要指定要与哪个 table 的列进行比较。
- 如果
test_table
与 table_1
或 table_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;
/
我正在尝试创建一个在 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
子句将产生不明确的引用错误。由于t1
和t2
都有一个ID
列,因此您需要指定要与哪个 table 的列进行比较。 - 如果
test_table
与table_1
或table_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;
/