触发器因 Oracle SQL 的编译错误而创建

朱启凡

我尝试使用 Oracle 触发器语法创建代码,但有一个警告:

使用编译错误创建的触发器

这是代码。当表中的价格itemtype设置为最低旧价格的四倍以上时,我想引发错误我怎样才能做到这一点?

我试图解决以前的问题!我成功创建了触发器,但它仅在插入时有效,当我试图更新表 itemType 上的价格时,仍然会出现“变异表”错误。如何更改我的代码以使其在更新时也能正常工作?

    CREATE or replace TRIGGER tr_price before insert or update on itemType for each row
    declare minimum float;
    begin
      select min(price)
      into minimum
      from itemType;
      if :new.price > 4*minimum
        then
        raise_application_error (-20000,'new price can not over 4 times min old price');
      END IF;
    end;
    /
数学小子

正如评论中所阐明的(或者,如果您回答了我的请求,在帖子本身中进行了编辑),您将遇到“变异表”错误。你想知道如何修复它。

唉,这不是编程错误。这是一个合乎逻辑的问题(Oracle 选择不忽略这一问题,通过引发“变异表”错误)。

Oracle 是一个多用户环境,SQL 允许您在一个事务中插入/更改/删除多行。这两件事都很好,但它们意味着你不能做你想做的事情。

“旧”最低价是多少?假设您已经有 20 行,最低价格为 55 美元。您再添加一行,价格为 50 美元。现在您尝试添加价格为 210 美元的另一行。什么是“旧最小值”?220 美元?为什么,因为价格为 50 美元的行已插入,但尚未提交?或者是200美元?如果在同一笔交易中,但稍后在您的代码中,您删除价格为 55 美元且下一个最低价格为 60 美元的行 - 您不应该允许价格高达 240 美元吗?

然后将这个问题复杂化:你插入了几行,但你还没有提交。然后其他人在同一个表中插入(或更新或删除),并提交他们的事务。现在你想提交。不应该在事务结束时再次执行“检查”,而不是“针对每一行”?

将 DML 语句的行为与表中的数据相关联的整个想法,因为它在某个时间或另一个时间存在(并且可能在您的事务中间发生变化,由您自己的其他活动或其他人的活动引起)用户),这是你必须理解的东西,与“业务经理”或“业务用户”讨论,他们可能不知道或不了解SQL,但必须了解这个问题并且必须提出逻辑要求。只允许插入价格“不超过旧最小值的四倍”在内部是不一致的,而且 Oracle 明智地不允许您做一些没有意义的事情。

所以 - 简短的回答是“你无法修复解决方案,因为解决方案没有被破坏,问题本身就被破坏了。” 您必须先解决问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章