存储过程和触发器中的实时 SQL 问题

Posted

技术标签:

【中文标题】存储过程和触发器中的实时 SQL 问题【英文标题】:Live SQL problems in storing procedures and triggers 【发布时间】:2021-12-01 11:50:52 【问题描述】:

我在将存储过程应用到我的数据库时遇到问题。 在我的 order_table 中,我有以下属性 order_table(orderID、数量、价格、折扣)。 当数量超过 500 时,我需要将折扣值设置为“是”,并将价格设置为 15% 的折扣。 我试图使用以下语法使用触发器:

create trigger discount_t
before insert or update on order_table
for each row
begin
if quantity > 500
then (discount = 'Yes') and (price = price - ((price*15)/100);
end if;
end;

使用此语法时,我收到以下错误:

Errors: TRIGGER DISCOUNT_T
Line/Col: 3/15 PLS-00103: Encountered the symbol "=" when expecting one of the following:

   := . ( @ % ;

Line/Col: 3/59 PLS-00103: Encountered the symbol ";" when expecting one of the following:

   ) , * & - + / at mod remainder rem <an exponent (**)> and or
   || year day

我对 Oracle/Live SQL 不是很熟悉,所以有人知道我做错了什么吗?

【问题讨论】:

【参考方案1】:

使用:new 绑定变量引用行的新值,使用:= 进行PL/SQL 中的赋值:

create trigger discount_t
before insert or update on order_table
for each row
begin
  if :NEW.quantity > 500 then
    :NEW.discount := 'Yes';
    :NEW.price := 0.85 * :NEW.price;
  end if;
end;
/

那么,对于表:

CREATE TABLE order_table (
  quantity NUMBER,
  discount VARCHAR2(3) DEFAULT 'No',
  price    NUMBER
);

如果你:

INSERT INTO order_table (quantity, price) VALUES (1000, 100);

SELECT * FROM order_table;

那么输出是:

QUANTITY DISCOUNT PRICE
1000 Yes 85

db小提琴here

【讨论】:

以上是关于存储过程和触发器中的实时 SQL 问题的主要内容,如果未能解决你的问题,请参考以下文章

关于存储过程

SQL 存储过程中的“引用旧”和“引用新”有啥区别?

Oracle --- 存储过程函数包游标触发器

Oracle --- 存储过程函数包游标触发器

Oracle --- 存储过程函数包游标触发器

使用参数在sql server中的触发器内执行存储过程