2012-11-23 90 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