2015-12-13 44 views
0

我試圖創建一個只允許數據插入或更新的觸發器,如果​​這些值爲存檔的'A'或打開的'O'。每當我運行代碼時,我都會收到一條消息,說明觸發器編譯有錯誤,然後我看到PLS-00382: expression is of the wrong type errorPLS-00382:表達式類型錯誤觸發器

我無法弄清楚什麼是錯的。在此之前,我使用||運算符而不是OR,並且觸發器編譯時沒有錯誤,但即使狀態設置爲'O''A',表中的任何更新仍會引發異常。我意識到||是不一樣的OR(我一直在使用Ruby和困惑自己)。任何幫助將不勝感激。我正在使用Oracle SQL Developer 11g。

CREATE OR REPLACE TRIGGER before_status 
    BEFORE INSERT OR UPDATE OF status ON blog_post 
    FOR EACH ROW 
BEGIN 
    IF :new.status != 'O' OR 'A' THEN 
    raise_application_error(-20101, 'Value must be A or O, cannot be anything else'); 
    END IF; 
END; 
+2

您需要用兩個比較('IF:new.status <> 'O' AND new.status <>「A'')或使用一組(如果' ('A','O')'中不是new.status)。現在寫的測試是'如果new.status!=('O'或'A')',('O'或'A')是一個布爾值(True或False),這是一個無效測試'new.status'。這是基本的SQL。 –

+0

非常感謝你的幫助Ken。我不知道爲什麼我沒有注意到我只有一個比較。將代碼更改爲以下內容:IF:new.status!='O'OR:new.status!='A',觸發器已成功編譯。 – iamedgarv

回答

2

直接的問題在評論中回答。你不必爲if正確的語法:

IF :new.status not in ('O', 'A') THEN 

更重要的是,你並不需要爲這個觸發。相反,只使用一個check約束:

alter table blog_post add constraint chk_status check (status in ('0', 'A')); 
+0

謝謝您的輸入Gordon,我現在明白我犯了錯誤的地方。我的評論指示說創建觸發器,它甚至沒有發生在我的檢查限制。感謝您的建議,我真的很感激。 – iamedgarv

相關問題