2012-03-11 42 views
2

我作爲this--如何在Oracle中創建一個觸發器,它會基於條件限制對錶的插入和更新查詢

create table account 
(
acct_id int, 
cust_id int, 
cust_name varchar(20) 
) 

insert into account values(1,20,'Mark'); 
insert into account values(2,23,'Tom'); 
insert into account values(3,24,'Jim'); 

我想創建一個觸發器,這將確保沒有帳戶表記錄可以被插入或帳戶表更新具有ACCT_ID如2和作爲CUST_ID 23.

我的代碼爲 -

create trigger tri_account 
before insert or update 
on account 
for each row 
begin 
    IF (:new.acct_id == 2 and :new.cust_id == 23) THEN 
     DBMS_OUTPUT.PUT_LINE('No insertion with id 2 and 23.'); 
rollback; 
    END IF; 
end; 

所以這個觸發器被創建,但與編譯錯誤。 現在,當我插入acct_id爲2和cust_id爲23的任何記錄時,它都允許。 但我得到一個錯誤說 ORA-04098:觸發器「OPS $ 0924769.TRI_ACCOUNT」是無效的,失敗再驗證

我不明白th​​is.I也想表明,存款保險計劃是插入一條消息不可能。 請幫助...

回答

19
  1. 等於運算符在甲骨文=,不==
  2. 您不能在觸發器中提交或回滾。您可以拋出異常,導致觸發語句失敗並回滾(儘管現有事務不一定會回滾)。
  3. 當您創建它時,不會顯示此觸發器已成功編譯。如果您正在使用SQL * Plus,則可以在創建PL/SQL對象後鍵入show errors以查看編譯錯誤。
  4. 您不應該編寫依賴於調用者能夠看到DBMS_OUTPUT的輸出的代碼。如果你的觸發器只是試圖寫入DBMS_OUTPUT緩衝區,那麼大多數應用程序並不會讓大多數應用程序不知道DML操作失敗。

把這些物品放在一起,你可以寫類似

create trigger tri_account 
before insert or update 
on account 
for each row 
begin 
    IF (:new.acct_id = 2 and :new.cust_id = 23) THEN 
     raise_application_error(-20001, 'No insertion with id 2 and 23.'); 
    END IF; 
end; 
+0

謝謝你的寶貴意見。 – 2012-03-11 12:13:57

+0

我仍然遇到這個錯誤,當我嘗試插入相同的記錄 - 插入到帳戶值(2,23,'JAMMm'); ORA-20001:沒有插入ID 2和23. ORA-06512:在「OPS $ 0924769.TRI_ACCOUNT」,第3行 ORA-04088:執行觸發器'OPS $ 0924769期間發生錯誤。 TRI_ACCOUNT' – 2012-03-11 12:14:42

+0

我還有一個問題如何在上面的代碼中的條件子句中使用to_char函數。我試過的是... IF(:new.acct_id = 2和(選擇to_char(:new.startdate,'MONTH'))='JUNE')它給我編譯錯誤。請幫忙。 – 2012-03-11 12:35:28

3

觸發器是更靈活,但你也可以通過使用一個CHECK約束實現這一點:

ALTER TABLE account ADD CONSTRAINT check_account CHECK (acct_id != 2 OR cust_id != 23) 
ENABLE NONVALIDATE; 

NONVALIDATE子句將確保檢查約束不會嘗試驗證現有數據,儘管它將驗證所有未來的數據。

希望這會有所幫助。

1
IF (:new.acct_id = 2 and :new.cust_id = 23) THEN 

必須OR,不and

+0

實際上,不是,2個id不同:一個是'acct_id',另一個是'cust_id' 。 'IF(:new.acct_id = 2和:new.cust_id = 23)THEN'是正確的。 – madeinqc 2017-04-11 18:22:02

0

使用條件檢查時,不需要使用冒號(:)。這將始終導致錯誤。

注意:僅在執行條件檢查的情況下排除冒號。

相關問題