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;

エラーメッセージは次の
とおりです。Error(27,46):PLS-00049:不正なバインド変数'NEW.CUSTNAME'
エラー(27,60):PLS-00049:不正なバインド変数'NEW.DOB'

4

1 に答える 1

1

トリガーはACCOUNTテーブルで定義されます。CUSTOMERテーブルの定義を投稿しました。ACCOUNTテーブルに列CustNameとが含まれている場合を除いてDOB、これはほとんどありそうにないようですが、参照することはできません。:new.CustNameまたは:new.DOB-:newレコードは現在ACCOUNTテーブルに挿入されている行のものです。

をどこで取得しCustName、テーブルDOBに挿入する予定ですか?Customer

一歩後退すると、そもそもテーブルのトリガーがAccountテーブルに行を挿入しようとしているのはなぜですか。Customerそれは非常に貧弱なデザインのようです。CustIDテーブル内のは、Accountおそらくテーブルを参照する外部キーになりCustomerます。ただし、制約を延期可能として宣言し、すべてのトランザクションの開始時にそれらを延期する場合にのみ、親行をトリガーに挿入できることを意味します。また、トリガーには通常、取得Customerするエラーの原因である、入力する列の情報を判別する方法がありません。

于 2012-11-16T04:15:26.537 に答える