【问题标题】:SQL statement ignored and ORA-00922 in Oracle11gOracle11g 中的 SQL 语句被忽略和 ORA-00922
【发布时间】:2020-02-26 05:24:50
【问题描述】:

我的触发器出现两个错误,无法找出问题所在,非常感谢任何帮助 :) 触发器应在更新 ListPrice 列时触发。触发器不应允许新标价低于 StandardCost + 20%。此触发器应允许任何价格上涨。如果价格过低,IT 应正确放弃更改,如果价格不太低,则允许更新。

首先创建这个表:

CREATE TABLE Product (
ProductID NUMBER NOT NULL PRIMARY KEY,
ListPrice NUMBER NOT NULL,
StandardCost NUMBER NOT NULL,
ProductDesc varchar2(20) NOT NULL
);

然后将此数据插入到表中:

INSERT INTO product VALUES(1, 20,10,'A');
INSERT INTO product VALUES(2, 21,12,'B');
INSERT INTO product VALUES(3, 22,14,'C');
INSERT INTO product VALUES(4, 23,16,'D');
INSERT INTO product VALUES(5, 40,19,'E');
INSERT INTO product VALUES(6, 22,10,'F');
INSERT INTO product VALUES(7, 25,21,'G');
INSERT INTO product VALUES(8, 29,22,'H');
INSERT INTO product VALUES(9, 25,23,'I');
INSERT INTO product VALUES(10, 30,25,'J');

这是我收到错误的触发器的代码:

CREATE OR REPLACE TRIGGER Product_Price_Check
BEFORE UPDATE OF listprice ON product
FOR EACH ROW
DECLARE
sCost NUMBER(10,5);
BEGIN
sCost := (:old.standardcost + (:old.standardcost*0.2));
IF((:new.listprice) > (:old.listprice))
THEN
SET :old.listprice := :new.listprice;
END IF;
IF (:new.listprice < (sCost))
THEN
RAISE_APPLICATION_ERROR(-20101,'cannot update as price is less');
END IF;
END;
/

这些是错误代码:

错误(6,1):PL/SQL:SQL 语句被忽略
错误(6,5):PL/SQL:bORA-00922:缺少或无效选项

【问题讨论】:

    标签: sql plsql oracle11g


    【解决方案1】:

    我知道不需要在代码中使用SET 关键字。除此之外,我们不能为旧的赋值。我已经在下面的代码中评论了该部分。此外,您可以完全评论第一个 if 块,因为您只需要在您的条件不满足时引发错误,否则它将允许更新。

    create or replace trigger product_price_check before
        update of listprice on product
        for each row
    declare
        scost   number(
            10,5
        );
    begin
        scost   :=:old.standardcost + (:old.standardcost * 0.2 );
    
        --if :new.listprice > :old.listprice then
            -- set :old.listprice   := :new.listprice;
        --end if;
    
        if (:new.listprice < ( scost ) ) then
            raise_application_error(
                -20101,
                'cannot update as price is less'
            );
        end if;
    
    end;
    /
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      相关资源
      最近更新 更多