Sql 如果满足多个条件,则使触发器中声明的变量追加其值

Sql 如果满足多个条件,则使触发器中声明的变量追加其值,sql,oracle,plsql,triggers,Sql,Oracle,Plsql,Triggers,我在写一个触发器,我希望每次满足条件时都附加声明的变量v_消息。因此,例如,如果满足前两条语句,v_消息应该类似于“Invalid account Invalid amount”。如果v_消息已经包含某种错误消息,我还必须找到一种方法,将这两条消息用空格分隔开来,因为如果您有类似“Invalid account Invalid amount”这样的内容,它将不可读 当我试图以“无效帐户无效金额”而不是“无效帐户无效金额”结束时,trim(v_消息)是否会删除所有前导和尾随空格?我尝试了代码,但它

我在写一个触发器,我希望每次满足条件时都附加声明的变量v_消息。因此,例如,如果满足前两条语句,v_消息应该类似于“Invalid account Invalid amount”。如果v_消息已经包含某种错误消息,我还必须找到一种方法,将这两条消息用空格分隔开来,因为如果您有类似“Invalid account Invalid amount”这样的内容,它将不可读


当我试图以“无效帐户无效金额”而不是“无效帐户无效金额”结束时,trim(v_消息)是否会删除所有前导和尾随空格?我尝试了代码,但它没有连接任何两条错误消息。虽然我有一个实例,其中付款有无效金额和无效帐户,但它只添加了第一条消息“无效帐户”。哦-我没有仔细考虑。。这些IF语句应该是不同的,而不是其他的。在编辑代码之前,我注意到了错误,并使用IF语句检查消息是否为null,如果是,则设置为“Ok”和“Y”。这几乎和你发布的解决方案一样。非常感谢您的帮助:)
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;
/
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;
/