当前位置: 首页 > 知识库问答 >
问题:

如何使用触发器SQL比较不同表中的两个值?

商昆琦
2023-03-14
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\u FABRICANT\u PRODUIT”。“PRIXFABRICANT”:无效标识符错误(2.92):PLS-00302:必须声明组件“PRIXFABRICANT”<错误(5,3):PL/SQL:忽略语句
错误(5,10):PLS-00201:标识符的新。必须声明“PRIXVENTE”。

共有2个答案

米子轩
2023-03-14

如果比较两个表,请使用:。。。哪里。。。并且存在(从中选择*)

郎雪风
2023-03-14

它不是new,而是: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;
/

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

 类似资料:
  • 问题内容: 我有3张桌子,每个国家和地区都有它的代币 还有这些国家中所有湖泊和所有山峰中的一个的表。 我现在必须说明山峰少于湖泊的国家。我现在尝试了几个小时,但找不到解决此问题的方法。我试图将3个表连接在一起- 但我不知道下一步该怎么做。我确定我必须使用嵌套的SQL命令。 这是我对每个国家的湖泊和山脉计数的尝试 但是以某种方式,两个列的count(Geo_lake.country)和count(G

  • 问题内容: 假设我有两个表,表A和表B,并且我想比较某个列。 例如, 表A包含以下列:IP,主机,应用 表B具有以下列:IP,数据中心,服务器,模型,最后更新 如何比较两个表之间的IP列以获取差异? 我知道表是否具有相同的列,我可以使用并集和“减号”来获取差异,但是我无法找出表具有不同列的方式。 谢谢! 问题答案: 这将输出两个表中不匹配行的所有列,并且在任一侧都有NULL。

  • 问题内容: 我是SQL的新手,有人可以帮助我修复触发器问题吗? 我有这两个表(“评论”和“报价”),我想更新“评论”表,然后在“插入”,“更新”和“删除”中获取要约表中的数据。如果更新成功,我想使用ReviewId和ReviewDate更新商品表。 我正在使用Azure提供的SQL Server。 UserKey和Asin是唯一的值,所以这就是我用来链接这些表的东西。我将非常感谢您的帮助! 桌子:

  • 问题内容: 可以说我有两个带有SSN变量的表,并且我想显示仅在一个表中的表,而不是两个表中的表。 正确的方法是什么? 问题答案: 这是一种方法: 这适用于大多数数据库,但不适用于MySQL。以下内容几乎可以在任何数据库中工作:

  • 问题内容: 我想知道如何比较两个不同的数据库 表记录 。我的意思是,我将比较两个数据库表,它们可能具有不同的列名但具有相同的数据。但是其中一个表可能比另一个表具有更多的记录,因此我想看看这两个表之间的区别是什么。为此,如何编写sql查询?仅供参考:这两个数据库都在同一个SQL Server实例下。 然后,在比较表1和表2之后,它应该 从 表2返回 Ruby Core。 问题答案: 如果执行从T1到

  • 问题内容: 我正在使用sqlite数据库。我的表架构是 表中的内容是这样的: 我使用以下sql语句选择名称及其按名称和dt分组的相应分数总和。 我有 现在,我想扩展查询,以便sql语句可以搜索其分数总和在不同时间(dt)不变的内容。在这种情况下,输出应为: 如何编写这样的sql? 问题答案: 这可以通过自我(反)联接来实现: