2015-07-10 111 views
1

我無法在pl/sql中找到以下問題的正確結構: 需要在「產品表」上觸發一個在插入新產品前檢查價格的觸發器,產品價格不得超過4000 $。在pl/sql中插入觸發器

CREATE or REPLACE TRIGGER pro 
BEFORE UPDATE OF price 
ON products 
FOR EACH ROW 
declare 
pr products.price%type; 
BEGIN 
if pr < 4000 then 
INSERT INTO products VALUES (:old.product_ID,:old.price); 
end if; 
END; 

請幫

+0

能否請您一些細節添加到你的要求?現在還不是很清楚...... – bcdan

+0

你的代碼有一個BEFORE UPDATE,但你的問題是關於INSERT ...? –

+0

是更新之前,但我需要它插入,我不能做..可以喲請幫助嗎? – Jaad

回答

3

使用check constraint INSTEAD OF觸發器:

create table products (price number); 

ALTER TABLE PRODUCTS ADD CONSTRAINT check_price CHECK (price < 4000); 

測試:

insert into products values (5000) => ERROR 

編輯:如果你堅持觸發版本:

CREATE or REPLACE TRIGGER pro BEFORE insert or UPDATE OF price ON products 
FOR EACH ROW 
BEGIN 
if :new.price > 4000 then 
    raise_application_error(-20101, 'Price exceeds 4000.'); 
end if; 
END; 
+0

我需要它使用PL/SQL中的triggre函數 – Jaad

+0

謝謝,只是爲了確保您使用「插入或更新」我想解決的問題是關於插入..這是一個準確的解決方案嗎?我不確定,因爲我是新來pl/sql – Jaad

+0

但在你的嘗試中,你寫道:_before update_,所以我做了插入和更新的版本 - 它似乎最符合邏輯。當然,如果你不需要,你可以刪除'更新'部分。但在目前的版本中它是通用的。 –

1

你會打擾一個觸發器而不是檢查約束的唯一原因是控制錯誤消息。請記住,觸發器假定操作正在發生,因此要停止操作,您的工具將引發異常。

CREATE OR REPLACE TRIGGER pro 
BEFORE INSERT OR UPDATE 
ON products 
FOR EACH ROW 
BEGIN 
if :new.price > 4000 then 
    RAISE_APPLICATION_ERROR(-20001,'Price exceeds maximum permitted value') ; 
end if; 
END; 
+0

得到這個錯誤「無法在SYS擁有的對象上創建觸發器」 – Jaad

+0

爲什麼你要把這個值-20001? – Jaad

+0

用戶定義的異常必須遵循Oracle錯誤代碼+消息格式,並且Oracle爲用戶定義的異常保留範圍-20000至-20999。所有其他錯誤代碼僅供內部使用 –

1

,如果你不喜歡引發錯誤,只是保留舊的價值觀我是這麼認爲的,使用此代碼:

CREATE or REPLACE TRIGGER pro 
     BEFORE UPDATE OF price 
     ON products 
     FOR EACH ROW 
declare 
    pr products.price%type; 
BEGIN 
    if :new.price > 4000 then 
    :new.price := :old.price; 
    :new.product_ID := :old.product_ID; 
    end if; 
END; 
+0

出現此錯誤「無法在SYS擁有的對象上創建觸發器」 – Jaad

+0

@Jaad您能告訴我什麼是產品表的所有者? – hmmftg

+0

我使用sys/sys作爲sysdba登錄 – Jaad