错误消息错误绑定变量在触发器中

时间:2012-11-16 04:03:49

标签: oracle plsql triggers

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

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

1 个答案:

答案 0 :(得分:1)

触发器在ACCOUNT表上定义。您已发布CUSTOMER表的定义。除非ACCOUNT表格中列CustNameDOB,这似乎不太可能,否则您无法引用:new.CustName:new.DOB - {{1记录用于当前插入:new表的行。

您打算将ACCOUNTCustName插入DOB表?

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