首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >忽略SQL语句和Oracle11g中的ORA-00922

忽略SQL语句和Oracle11g中的ORA-00922
EN

Stack Overflow用户
提问于 2020-02-26 05:24:50
回答 1查看 75关注 0票数 1

我的触发器有两个错误,并且还无法确定问题出在哪里,任何帮助都是非常感谢的:)触发器应该会触发ListPrice列的更新。触发器不应允许新的列表价格低于StandardCost + 20%。此触发器应该允许任何价格,如果价格太低,increase.IT应该正确地放弃更改;如果价格不太低,则允许更新。

首先创建此表:

代码语言:javascript
运行
复制
CREATE TABLE Product (
ProductID NUMBER NOT NULL PRIMARY KEY,
ListPrice NUMBER NOT NULL,
StandardCost NUMBER NOT NULL,
ProductDesc varchar2(20) NOT NULL
);

然后将这些数据插入表中:

代码语言:javascript
运行
复制
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');

下面是我得到错误的触发器的代码:

代码语言:javascript
运行
复制
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:丢失或无效选项

EN

回答 1

Stack Overflow用户

发布于 2020-02-26 05:51:11

我理解在代码中不需要使用SET关键字。除此之外,我们不能将价值分配给旧的。我在下面的代码中对此部分进行了评论。此外,您可以完全注释第一个if块,因为如果您的条件不满足,只需要引发错误,否则它将允许更新。

代码语言:javascript
运行
复制
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;
/
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60407293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档