Oracle Trigger If语句条件不能以某种方式得到满足?

Mo *_*osa 3 sql database oracle triggers

谢谢阅读.我目前正在为一家假想商店开发一个大约10个实体的数据库.因此,主要实体是Customer_Order,此触发器的目的是在Customer_order中插入或更新行时检查客户的邮政编码是否为空.如果为null,则触发器应该发出警告.

CREATE OR REPLACE TRIGGER Check_Order  
BEFORE INSERT OR UPDATE ON Customer_Order 
for each row
DECLARE ShipAddress customer.ship_address.post_code%TYPE;
BEGIN 
IF (ShipAddress = '') then 
RAISE_APPLICATION_ERROR(-20103, 'Shipping Address is empty');
END IF;
END; 
. 
run
Run Code Online (Sandbox Code Playgroud)

我知道没有"Else",但除了更新它所做的表之外,我没有任何其他行动.不要担心ShipAddress,我尝试使用更简单的属性,它根本不会触发.所有发生的事情是该行将被插入或更新,因此它不符合条件.我已经尝试了各种各样的方法,例如"if(Payment_No ='PAYM0001')也不起作用.是不是因为我使用的是每个而不是语句级触发器?

a_h*_*ame 6

Oracle静默地将空字符串(即长度为零的字符串)转换为NULL.因此'',您的专栏中永远不会有任何价值.因此IF语句永远不会成立.您需要在该触发器中检查NULL:

IF (ShipAddress IS NULL) then 
  RAISE_APPLICATION_ERROR(-20103, 'Shipping Address is empty');
END IF;
Run Code Online (Sandbox Code Playgroud)

但是你真的应该遵循Ben的建议并简单地将该列声明为NOT NULL,而不是使用触发器来检查它.

编辑

您可以使用表格上的检查约束执行非空检查:

 CREATE TABLE FOO
 (
    shipping_address ship_addres,
    CONSTRAINT check_post_code CHECK (shipping_address.post_code IS NOT NULL)
 )
Run Code Online (Sandbox Code Playgroud)