SQL语句被忽略,Oracle11g中的ORA-00922

SQL语句被忽略,Oracle11g中的ORA-00922,sql,plsql,oracle11g,Sql,Plsql,Oracle11g,我的触发器出现了两个错误,但一直无法找出问题所在,非常感谢您的帮助:) 触发器应在更新ListPrice列时触发。触发器不应允许新标价低于标准成本+20%。此触发器应允许任何价格上涨。如果价格过低,则应正确放弃更改;如果价格不过低,则应允许更新 首先创建此表: CREATE TABLE Product ( ProductID NUMBER NOT NULL PRIMARY KEY, ListPrice NUMBER NOT NULL, StandardCost NUMBER NOT NULL,

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

首先创建此表:

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;
/
创建或替换触发器产品\u价格\u检查
在更新产品的价目表之前
每行
声明
sCost编号(10,5);
开始
sCost:=(:old.standardcost+(:old.standardcost*0.2));
如果((:new.listprice)>(:old.listprice))
然后
SET:old.listprice:=:new.listprice;
如果结束;
如果(:new.listprice<(sCost))
然后
RAISE_应用程序_错误(-20101,“由于价格较低而无法更新”);
如果结束;
结束;
/
以下是错误代码:

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


我知道不需要在代码中设置用户
关键字。除此之外,我们不能赋予旧的价值。我已经在下面的代码中对该部分进行了注释。此外,您可以完全先注释
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;
/
创建或替换触发产品\u价格\u检查之前
更新产品的价目表
每行
声明
scost编号(
10,5
);
开始
scost:=:old.standardcost+(:old.standardcost*0.2);
--如果:new.listprice>:old.listprice则
--set:old.listprice:=:new.listprice;
--如果结束;
如果(:new.listprice<(scost)),则
引发应用程序错误(
-20101,
'无法更新,因为价格较低'
);
如果结束;
结束;
/