【问题标题】:How to compare two values in different tables with a TRIGGER SQL?如何使用 TRIGGER SQL 比较不同表中的两个值?
【发布时间】:2021-01-16 11:00:43
【问题描述】:
CREATE TRIGGER Comparer_Prix 
BEFORE UPDATE ON ARTICLE 
FOR EACH ROW BEGIN 
SELECT ARTICLE.PRIXVENTE, ARTICLE.N_PRODUIT, ARTICLE.N_FABRICANT, LIEN_FABRICANT_PRODUIT.PRIXFABRICANT, LIEN_FABRICANT_PRODUIT.N_PRODUIT, LIEN_FABRICANT_PRODUIT.N_FABRICANT 
FROM ARTICLE, LIEN_FABRICANT_PRODUIT 
WHERE ARTICLE.N_FABRICANT=LIEN_FABRICANT_PRODUIT.N_FABRICANT AND ARTICLE.N_PRODUIT=LIEN_FABRICANT_PRODUIT.N_PRODUIT; 
IF (NEW.PRIXVENTE< PRIXFABRICANT) THEN RAISE_APPLICATION_ERROR(-20001, 'Refusé'); 
END IF; 
END;

我正在尝试创建一个对以下规则进行编码的触发器:销售价格必须始终高于制造价格。

这是我得到的错误:

错误(2,3):PL/SQL:SQL 语句被忽略
错误(2,69):PL/SQL:ORA-00904:“LIEN_FABRICANT_PRODUIT”。“PRIXFABRICANT”:标识符无效
错误 (2.92):PLS-00302:必须声明组件“PRIXFABRICANT”。
错误 (5,3):PL/SQL:语句被忽略
错误(5,10):PLS-00201:必须声明标识符“NEW.PRIXVENTE”。

【问题讨论】:

    标签: sql oracle triggers


    【解决方案1】:

    不是new,而是:new(你少了一个冒号)。

    不过,这不是这里唯一的问题;您无法从刚刚修改的表格中进行选择;预计会出现变异表错误。幸运的是,您不必从 article 中进行选择,因为您可以使用相同的 :new 值来引用它的值。

    ORA-00904 表示您使用了该表中不存在的列名。由于您没有发布表格的描述,我只是在重复您所写的内容。自己修。

    类似这样的:

    create or replace trigger comparer_prix
      before update on article
      for each row
    declare
      l_prixfabricant   lien_fabricant_produit.prixfabricant%type;
    begin
      select prixfabricant
        into l_prixfabricant
        from lien_fabricant_produit
        where n_fabricatn = :new.n_fabricant
          and n_produit   = :new.n_produit;
    
      if :new.prixvente < l_prixfabricant then
         raise_application_error(-20001, 'Refusé');
      end if;
    end;
    /
    

    此外,如果您学会了如何正确格式化代码并使其更易于阅读,那也不会有害处。使用表别名(而不是那些冗长的表名)。

    【讨论】:

      【解决方案2】:

      如果您比较两个表,请使用: ... WHERE ... AND EXISTS(SELECT * FROM )

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-07
        • 2014-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-28
        • 1970-01-01
        相关资源
        最近更新 更多