如果满足多个条件,则在触发器内使声明的变量附加其值

时间:2016-03-09 20:55:52

标签: sql oracle plsql triggers

我正在编写一个触发器,我希望每次满足条件时都声明变量v_message。因此,例如,如果满足前两个语句,则v_message应该类似于“无效帐户无效金额”。如果v_message已经包含某种错误消息,我还必须找到一种方法将这两个消息用空格分开,因为如果你有类似“无效的帐户无效金额”这样的东西它将无法读取。

CREATE OR REPLACE TRIGGER checkPayments
BEFORE INSERT ON tbl_payments
FOR EACH ROW 
DECLARE 
    v_message VARCHAR(100 CHAR);
        v_is_valid CHAR(1) := 'N';
BEGIN 

    IF getActiveUser(getOrderUsername(:new.order_id)) = 0 
    THEN v_message := 'Invalid account';

    ELSIF isValidAmount(:new.payment_amount) = 0
    THEN v_message := 'Invalid amount';

    ELSIF checkOrderExist(:new.order_id) = 0 
    THEN v_message := 'Invalid order ID';

    ELSIF (getValidOrderPayments(:new.order_id) + :new.payment_amount ) > getOrderTotal(:new.order_id)
    THEN  v_message := 'Payment exceeds total';

    ELSE v_message := 'OK' ; 
        v_is_valid := 'Y';

    END IF;

    :new.payment_id:= seq_payment_id.nextval;
    :new.payment_date:= LOCALTIMESTAMP;
    :new.payment_message := v_message;
    :new.is_valid := v_is_valid;

END;
/

1 个答案:

答案 0 :(得分:2)

CREATE OR REPLACE TRIGGER checkPayments
BEFORE INSERT ON tbl_payments
FOR EACH ROW 
DECLARE 
    v_message VARCHAR(100 CHAR);
        v_is_valid CHAR(1) := 'N';
BEGIN 

    v_is_valid := 'Y';

    IF getActiveUser(getOrderUsername(:new.order_id)) = 0 
        THEN v_message := 'Invalid account';
        v_is_valid := 'N';
    END IF;

    IF isValidAmount(:new.payment_amount) = 0
        THEN v_message := v_message || ' Invalid amount';
        v_is_valid := 'N';
    END IF;

    IF checkOrderExist(:new.order_id) = 0 
        THEN v_message := v_message || ' Invalid order ID';
        v_is_valid := 'N';
    END IF;

    IF (getValidOrderPayments(:new.order_id) + :new.payment_amount ) > getOrderTotal(:new.order_id)
        THEN  v_message := v_message || ' Payment exceeds total';
        v_is_valid := 'N';
    END IF;

    IF v_is_valid = 'Y'
        THEN v_message := 'OK' ;    
    END IF;

    :new.payment_id:= seq_payment_id.nextval;
    :new.payment_date:= LOCALTIMESTAMP;
    :new.payment_message := trim(v_message);
    :new.is_valid := v_is_valid;

END;
/