PL / SQL计算触发器的百分比

时间:2016-11-06 00:00:20

标签: oracle plsql

我是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; 

5 个答案:

答案 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;