2

我正在尝试编写一个触发器来验证客户/地址在插入之前是否存在,但我遇到了一些错误。能就此提出建议吗?

下表是:
客户 (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”

4

1 回答 1

1

触发器是在ACCOUNT表上定义的。您已经发布了CUSTOMER表的定义。除非ACCOUNT表有列CustNameDOB,这似乎不太可能,否则您不能引用:new.CustNameor :new.DOB--:new记录是当前插入ACCOUNT表中的行。

您打算在哪里获取CustNameandDOB插入Customer表中?

退后一步,为什么Account表上的触发器首先尝试将行插入Customer表中。这似乎是一个非常糟糕的设计。表CustID中的Account可能是引用该Customer表的外键。但是,这意味着,如果您将约束声明为可延迟并在每个事务开始时延迟它们,您只能在触发器中插入父行。触发器通常也无法确定Customer您要填充的列的信息,这是您遇到的错误的来源。

于 2012-11-16T04:15:26.537 回答