【问题标题】: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 之前触发……什么?我把它注释掉了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 2014-06-28
      • 1970-01-01
      • 2015-03-26
      • 2018-04-04
      • 1970-01-01
      • 2021-11-16
      相关资源
      最近更新 更多