【问题标题】:Oracle SQL trigger with JOIN带有 JOIN 的 Oracle SQL 触发器
【发布时间】:2021-08-14 14:37:30
【问题描述】:
CREATE OR REPLACE TRIGGER TRIGGER_NAME
BEFORE INSERT OR UPDATE of ON TABLE_NAME
FOR EACH ROW
BEGIN
if inserting then
if :new.col_a < (select col_b from table_a natural join table_b where some_col = :new.some_value)
then
raise_application_error(-20000, 'Raise some error');
end if;
end if;
END;
当我尝试编译时出现此错误
错误(6,93):PLS-00103:预期时遇到符号“JOIN”
以下之一:) ,组有 intersect 减去 start
union where connect 符号“,”被替换为“JOIN”
继续。
我错过了什么?
【问题讨论】:
标签:
sql
oracle
plsql
triggers
【解决方案1】:
导致错误的不是JOIN,而是在这种情况下子查询的使用无效。首先选择值(从IF 中选择),稍后再使用。像这样的:
CREATE OR REPLACE TRIGGER trigger_name
BEFORE INSERT
--OR UPDATE of --> of what?
ON table_name
FOR EACH ROW
DECLARE
l_col_b table_b.col_b%TYPE;
BEGIN
IF INSERTING
THEN
SELECT col_b
INTO l_col_b
FROM table_a NATURAL JOIN table_b
WHERE some_col = :new.some_value;
IF :new.col_a < l_col_b
THEN
raise_application_error (-20000, 'Raise some error');
END IF;
END IF;
END;
另外,使用表别名。不可能知道哪个列属于哪个表。此外,您的触发器想在update of 之前触发……什么?我把它注释掉了。