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