2012-11-23 87 views
1

我寫了觸發器來檢查客戶是否有任何暫停的帳戶。如果是,他將無法創建新帳戶,但是當我嘗試插入時,插入仍然會通過。有人可以幫助我嗎?觸發器和計數(*)不起作用

CREATE OR REPLACE TRIGGER SuspendedAccount 
BEFORE INSERT ON ACCOUNT 

FOR EACH ROW 

DECLARE 

varIsProblemAccount Int; 

BEGIN 

SELECT COUNT(*) INTO varIsProblemAccount 
FROM ACCOUNT 
WHERE CUSTID = :new.custID 
    AND ACCSTATUS = 'Suspended'; 

IF (varIsProblemAccount >= 1) THEN  
     DBMS_OUTPUT.PUT_LINE('*************************************************'); 
     DBMS_OUTPUT.PUT_LINE(''); 
     DBMS_OUTPUT.PUT_LINE(' Transaction canceled. '); 
     DBMS_OUTPUT.PUT_LINE(''); 
     DBMS_OUTPUT.PUT_LINE(' Refer customer to the manager immediately. '); 
     DBMS_OUTPUT.PUT_LINE(''); 
     DBMS_OUTPUT.PUT_LINE('**************************************************'); 
     RETURN; 
    END; 

ELSIF (varIsProblemAccount = 0) THEN 

    BEGIN 
     DBMS_OUTPUT.PUT_LINE('*************************************************'); 
     DBMS_OUTPUT.PUT_LINE(''); 
     DBMS_OUTPUT.PUT_LINE(' Transaction completed. '); 
     DBMS_OUTPUT.PUT_LINE(''); 
     DBMS_OUTPUT.PUT_LINE(' Thank the customer for their business. '); 
     DBMS_OUTPUT.PUT_LINE(''); 
     DBMS_OUTPUT.PUT_LINE('**************************************************'); 
    END; 
END IF; 
END; 

對不起,我試圖更改爲0,因爲它永遠是「空」,但它仍然沒有工作

+0

我認爲你不能在同一個表的觸發器觸發是做DML。這會引發一個「變異表」異常? – Rene

回答

1

,您的觸發並不做任何事情來阻止INSERT - 只返回過早退出觸發器主體。

如果你想防止INSERT,你應該提出一個例外,而不是:

IF (varIsProblemAccount >= 1) THEN  
    raise_application_error(-20001, 'Existing account found'); 
END; 
+0

此外,觸發器和存儲過程中的DBMS_OUTPUT不能打印,也不會將任何內容打印到終端。例如,它適用於從sqlplus進行調試。 –

2

的問題是你的其他條件!

CREATE OR REPLACE TRIGGER SuspendedAccount 
BEFORE INSERT ON ACCOUNT 

FOR EACH ROW 

DECLARE 

varIsProblemAccount Int; 

BEGIN 

SELECT COUNT(*) INTO varIsProblemAccount 
FROM ACCOUNT 
WHERE CUSTID = :new.custID 
    AND ACCSTATUS = 'Suspended'; 

IF (varIsProblemAccount >= 1) THEN  
     DBMS_OUTPUT.PUT_LINE('*************************************************'); 
     DBMS_OUTPUT.PUT_LINE(''); 
     DBMS_OUTPUT.PUT_LINE(' Transaction canceled. '); 
     DBMS_OUTPUT.PUT_LINE(''); 
     DBMS_OUTPUT.PUT_LINE(' Refer customer to the manager immediately. '); 
     DBMS_OUTPUT.PUT_LINE(''); 
     DBMS_OUTPUT.PUT_LINE('**************************************************'); 
     RETURN; 
    END; 

-- count() never returns NULL 
ELSIF (varIsProblemAccount = 0) THEN 

    BEGIN 
     DBMS_OUTPUT.PUT_LINE('*************************************************'); 
     DBMS_OUTPUT.PUT_LINE(''); 
     DBMS_OUTPUT.PUT_LINE(' Transaction completed. '); 
     DBMS_OUTPUT.PUT_LINE(''); 
     DBMS_OUTPUT.PUT_LINE(' Thank the customer for their business. '); 
     DBMS_OUTPUT.PUT_LINE(''); 
     DBMS_OUTPUT.PUT_LINE('**************************************************'); 
    END; 
END IF; 
END; 
1

試着將下面的代碼

ELSIF (varIsProblemAccount = null) THEN 

ELSIF (varIsProblemAccount = 0) THEN 
+0

或當然,只是'else',因爲如果它沒有進入初始IF,它將爲零。 – DazzaL