2011-12-04 100 views
3

感謝您的閱讀。我目前正在爲一家假設商店開發一個約10個實體的數據庫。因此,主要實體是Customer_Order,此觸發器的目的是在Customer_order中插入或更新一行時檢查客戶的郵政編碼是否爲空。如果它爲空,則觸發器應該發出警告。Oracle觸發器如果語句條件沒有得到滿足?

CREATE OR REPLACE TRIGGER Check_Order 
BEFORE INSERT OR UPDATE ON Customer_Order 
for each row 
DECLARE ShipAddress customer.ship_address.post_code%TYPE; 
BEGIN 
IF (ShipAddress = '') then 
RAISE_APPLICATION_ERROR(-20103, 'Shipping Address is empty'); 
END IF; 
END; 
. 
run 

我知道有沒有「其他」,但我沒有任何其他操作以外,以更新其它表。 不要擔心ShipAddress,我已經試過這個更簡單的屬性,它根本不會觸發。所發生的只是該行將被插入或更新,所以它不符合條件。我嘗試了各種方法,比如「if(Payment_No ='PAYM0001')」,它不起作用,是因爲我使用的是每個而不是語句級觸發器嗎?

回答

6

Oracle默認將空字符串(即長度爲零的字符串)轉換爲NULL。所以在你的專欄中永遠不會有''值。因此,IF語句永遠不會是真的。您需要在觸發檢查NULL:

IF (ShipAddress IS NULL) then 
    RAISE_APPLICATION_ERROR(-20103, 'Shipping Address is empty'); 
END IF; 

但你要真的,真的跟隨本的意見和簡單的聲明,列NOT NULL,而不是使用觸發器來檢查。

編輯

你能做到不空支票與你的表檢查約束:

CREATE TABLE FOO 
(
    shipping_address ship_addres, 
    CONSTRAINT check_post_code CHECK (shipping_address.post_code IS NOT NULL) 
) 
+0

啊我明白了。我實際上不知道如何創建一個名爲addressType的類型來聲明它不爲null。在我的系統中,所有客戶和員工(「人員」的子類型)都繼承了包含其各種值的地址類型,並且我無法弄清楚如何在不製作對象表的情況下將其實際設置爲NOT NULL。如果你知道一種方式,我會很感激,如果你可以花時間分享它。謝謝你的幫助! –

+0

@MoMoosa:看看我編輯的例子沒有如何聲明你的類型的屬性不爲null –

1

Oracle使用3值邏輯,null是第三個值,可能是真,假或不存在,null是不存在的,等於沒有,你不能用等號運算符測試null,使用IF :new.ShipAddress is null來測試空值

你還錯誤地引用該列中的扳機。有沒有必要宣佈任何東西,你必須引用:new:old值。This是一個很好的資源。

通過在表上設置約束來禁止空值會更好,所以shipaddress永遠不能爲空。見here。所以,

alter table my_table modify shipaddress not null; 

把它添加到表中。儘管在創建表格時添加約束會更好。這樣做也會稍微加快速度,因爲您不需要評估觸發器。

編輯:

shipaddress已經被完整的地址的戒指,也許逗號分隔的?我肯定會推薦將地址的每個部分分離出來,例如,address1address2, address3,town,county,postcode。我是英國人,所以根據需要改爲statezip等。這使得查詢和處理數據,如果你需要做的更多,更容易。

+0

謝謝你,我已經改變了表,工作得非常好。我應該解釋一下shipAddress,它包含了包含城鎮,縣和郵政編碼的地址類型,以及包含街道和號碼的街道類型 - 在事後看來可能是不必要的 - 這是可行的。我完全同意,但我看過其他的學生只有單一字符串的地址,所以至少我得到這個部分是正確的。非常感謝您的幫助! –

相關問題