簡體   English   中英

Oracle11g 中的 SQL 語句被忽略和 ORA-00922

[英]SQL statement ignored and ORA-00922 in Oracle11g

我的觸發器出現兩個錯誤,並且無法找出問題出在哪里,非常感謝任何幫助:) 觸發器應該在更新 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: 缺少或無效的選項

我知道不需要在代碼中使用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;
/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM