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;

申し訳ありませんが、「NULL」になることはできないため、0に変更しようとしましたが、それでも機能しません

4

3 に答える 3

2

問題はあなたのelse-conditionです!

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;
于 2012-11-23T09:15:05.127 に答える
1

トリガーは INSERT を防ぐために何もしません - RETURN はトリガー本体を途中で終了します。

INSERT を防止したい場合は、代わりに例外を発生させる必要があります。

IF (varIsProblemAccount >= 1) THEN      
    raise_application_error(-20001, 'Existing account found');
END;
于 2012-11-23T09:28:59.877 に答える
1

次のコードを変更してみてください

ELSIF (varIsProblemAccount = null) THEN

ELSIF (varIsProblemAccount = 0) THEN
于 2012-11-23T09:15:05.490 に答える