![](/img/trans.png)
[英]Create Table / Sequence / Trigger in Apex Oracle SQL - ORA-00922 / ORA-00907 / 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.