我正在尝试编写触发器以在插入之前验证客户/地址是否存在但我遇到了一些错误。能够就此提出建议吗?
下表:
客户(CustID,CustName,DOB)
CREATE OR REPLACE TRIGGER CREATEACCOUNT
BEFORE INSERT ON ACCOUNT
FOR EACH ROW
DECLARE
newCustID varchar(10);
newPostCode int;
newStreet char;
newAccType varchar(15);
newAccStatus char(9);
newAccBalance int;
varRowCount int;
BEGIN
newCustID := :new.CustID;
SELECT COUNT(*)
INTO varRowCount
FROM Customer
WHERE CustID = newCustID;
IF (varRowCount > 0) THEN
RETURN;
END IF;
IF (varRowCount = 0) THEN
BEGIN
INSERT INTO CUSTOMER VALUES (newCustID,:new.CustName,:new.DOB);
END;
END IF;
END;
以下是错误消息:
错误(27,46):PLS-00049:错误的绑定变量'NEW.CUSTNAME'
错误(27,60):PLS-00049:错误的绑定变量'NEW.DOB'
答案 0 :(得分:1)
触发器在ACCOUNT
表上定义。您已发布CUSTOMER
表的定义。除非ACCOUNT
表格中列CustName
和DOB
,这似乎不太可能,否则您无法引用:new.CustName
或:new.DOB
- {{1记录用于当前插入:new
表的行。
您打算将ACCOUNT
和CustName
插入DOB
表?
退一步,为什么Customer
表上的触发器试图首先在Account
表中插入一行。这似乎是一个非常糟糕的设计。 Customer
表中的CustID
可能是引用Account
表的外键。但是,如果您将约束声明为deferred并在每个事务开始时将它们推迟,那么这意味着您只能在触发器中插入父行。触发器通常也无法确定要填充的Customer
列的信息,这是您获得的错误的来源。