我是PL / SQL的新手,我想弄清楚在触发器上使用百分比的正确方法是什么。这是我的问题:
我想创建一个触发器,只要新价格减少> 20%,触发器就会触发,仅在减少时触发。我认为我的逻辑是正确的,但我不能让它工作:
表:
String supplementary = "Some Supplementary: ";
supplementary.codePoints().forEach(cp ->
System.out.print(new String(Character.toChars(cp))));
代码:
Product: pid, price, pname
我继续遇到这样的错误:
set serveroutput on;
show errors;
update product
set price = 3000
where pid = 2;
select * from product;
create or replace trigger percentage
after update on product
for each row when ((((new.price - old.price) / old.price) * 100)>.20)
declare
x product.pname%type;
y varchar(100);
begin
y := (((:new.price - :old.price) / :old.price) * 100);
dbms_output.put_line('The Product: '||:new.pname|| ' price has decreased by: '|| y ||'%');
end;
答案 0 :(得分:2)
逻辑的最简单表示似乎是:
new.price < 0.8 * old.price
我不喜欢将更改表示为“减少 更多而不是......”的想法。语义很奇怪。
“降低到低于”的值似乎是更好的表达方式。
答案 1 :(得分:1)
PL / SQL中的赋值符号是&#34;:=&#34;不是&#34; =&#34;正如您在Begin
之后的第一行代码中使用的那样答案 2 :(得分:1)
您的触发器的编写方式只会在价格增加超过 2/10%或更多的情况下触发。我们来举个例子:
如果NEW.PRICE
为101且OLD.PRICE
为100,则WHEN
子句中的计算
((((new.price - old.price) / old.price) * 100)
将计算为
((((101 - 100 ) / 100) * 100)
并且这产生(1/100)* 100的结果,即1.0。因为1.0大于0.20,触发器将会触发。
显然,这不是你的想法。
我认为您要将WHEN子句更改为
WHEN ((((OLD.PRICE - NEW.PRICE) / OLD.PRICE) * 100) > 20)
鉴于此,让我们重新考虑我们的第一个例子:
(((100 - 101) / 100) * 100)
产生-1,触发器不会触发,这是正确的。
现在,让我们考虑触发器应该触发的示例。我们的旧价格为100,新价格为70,我们的计算结果为
(((100 - 70) / 100) * 100)
产生30的结果,因此触发器触发。
试一试。
祝你好运。
答案 3 :(得分:0)
for each row when ((((new.price - old.price) / old.price) * 100) < -.20)
declare
y varchar(100);
begin
y:= (((:new.price - :old.price) / :old.price) * 100);
答案 4 :(得分:0)
到目前为止,把所有好的建议放在一起,你应该得到这样的东西:
create or replace trigger percentage after update on product for each row
when (new.price < old.price * 0.8)
declare
l_percent number(6,1) := 100 * (:old.price - :new.price) / nullif(:old.price,0);
begin
dbms_output.put_line('Product '||:new.pname||' price has decreased by '|| l_percent ||'%');
end;