【问题标题】:insert trigger in pl/sql在 pl/sql 中插入触发器
【发布时间】:2017-11-27 15:35:49
【问题描述】:

我在 pl/sql 中找不到以下问题的正确结构: 需要在“产品表”上设置一个触发器,在插入新产品之前检查价格,产品价格不得超过 4000 美元。

CREATE or REPLACE TRIGGER pro 
BEFORE UPDATE OF price 
ON products
FOR EACH ROW 
declare 
pr products.price%type;
BEGIN 
if pr < 4000 then 
INSERT INTO products VALUES (:old.product_ID,:old.price);
end if; 
END;

请帮忙

【问题讨论】:

  • 您能否在您的要求中添加一些细节?现在还不是很清楚……
  • 您的代码有一个 BEFORE UPDATE,但您的问题是关于 INSERT...?
  • 是的,它是更新前的,但我需要将其插入,我不能这样做..你能帮忙吗?

标签: sql oracle plsql


【解决方案1】:

使用check constraint 代替触发器:

create table products (price number);

ALTER TABLE PRODUCTS ADD CONSTRAINT check_price CHECK (price < 4000);

测试:

insert into products values (5000)  => ERROR

编辑:如果你坚持触发版本:

CREATE or REPLACE TRIGGER pro BEFORE insert or UPDATE OF price ON products 
FOR EACH ROW 
BEGIN 
if :new.price > 4000 then 
  raise_application_error(-20101, 'Price exceeds 4000.');
end if; 
END;

【讨论】:

  • 我需要在 PL/SQL 中使用触发函数
  • 谢谢,只是为了确保您使用了“插入或更新”我要解决的问题是仅插入..这是一个准确的解决方案吗?我不确定,因为我是 pl/sql 的新手
  • 但在您的尝试中,您写道:更新前 所以我为插入和更新制作了版本 - 这似乎最合乎逻辑。当然,如果您不想要它,您可以删除 update of 部分。但在当前版本中,它是通用的。
  • 我在第 1 行收到此错误 ERROR:ORA-04071:缺少 BEFORE、AFTER 或 INSTEAD OF 关键字
  • 你为什么把这个值设置为-20101?
【解决方案2】:

您会为此使用触发器而不是检查约束的唯一原因是控制错误消息。请记住,触发器假定操作正在发生,因此要停止操作,您的工具就是引发异常。

CREATE OR REPLACE TRIGGER pro 
BEFORE INSERT OR UPDATE
ON products
FOR EACH ROW 
BEGIN 
if :new.price > 4000 then 
     RAISE_APPLICATION_ERROR(-20001,'Price exceeds maximum permitted value') ;
end if; 
END;

【讨论】:

  • 收到此错误“无法在 SYS 拥有的对象上创建触发器”
  • 为什么你把这个值设置为-20001?
  • 用户定义的异常必须遵循Oracle错误代码+消息格式,Oracle为用户定义的异常保留-20000到-20999的范围。所有其他错误代码仅供内部使用
【解决方案3】:

如果您不喜欢引发错误并按照我的想法保留旧值,请使用以下代码:

CREATE or REPLACE TRIGGER pro 
      BEFORE UPDATE OF price 
      ON products
      FOR EACH ROW 
declare 
   pr products.price%type;
BEGIN 
  if :new.price > 4000 then 
     :new.price := :old.price;
     :new.product_ID := :old.product_ID;
  end if; 
END;

【讨论】:

  • 收到此错误“无法在 SYS 拥有的对象上创建触发器”
  • @Jaad 你能告诉我 products 表的所有者是什么吗?
  • 我使用sys/sys作为sysdba登录
  • @Jaad 您的产品表是在 Sys 模式中创建的吗?可以使用 Owner of products 表登录吗?
猜你喜欢
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多