2

トリガーを作成しようとすると、このエラー メッセージが表示され、少し困惑しました。これが私のトリガーコードです。

CREATE OR REPLACE TRIGGER CUSTOMER_AD
  AFTER DELETE ON CUSTOMER
  REFERENCING OLD AS OLD
  FOR EACH ROW
DECLARE
  nPlaced_order_count  NUMBER;
BEGIN
  SELECT COUNT(*)
    INTO nPlaced_order_count
    FROM PLACED_ORDERS p
    WHERE p.FK1_CUSTOMER_ID = OLD.CUSTOMER_ID;
IF nPlaced_order_count > 0 THEN
INSERT into previous_customer
(customer_id,
first_name,
last_name,
address,
AUDIT_USER,
AUDIT_DATE)
VALUES
(:old.customer_id,
:old.first_name,
:old.last_name,
:old.address,
UPPER(v('APP_USER')),
SYSDATE);
END IF;
END CUSTOMER_AD;

そして、「4行目のエラー: PL/SQL: SQL文が0.10秒無視されました」というエラーが表示されます

誰でも理由を推測できますか?

助けてくれてありがとう

4

1 に答える 1

4

表示されるエラーは最高レベルのみです。実行している場所によっては、スタック トレースを確認できるはずです。クライアントはそれを行う方法を正確に決定します。いずれにせよ、SQL*Plus または SQL Developer はこれ以上のものを表示しますが、他のクライアントについてはよく知りません。クライアントに詳細が表示されない場合は、次の方法でクエリを実行できます。

select * from user_errors where name = 'CUSTOMER_AD' and type = 'TRIGGER'

テーブルがすべて存在すると仮定すると、おそらく次の行になります。

WHERE p.FK1_CUSTOMER_ID = OLD.CUSTOMER_ID;

次のようになります。

WHERE p.FK1_CUSTOMER_ID = :OLD.CUSTOMER_ID;

テーブルから古い (または新しい) 値を参照する場合、referencing句で指定されている名前の前にコロンが付けられているため:OLD、この場合です。あなたがすでにinsert ... values()節でやっているように。

(コメントから、私の仮定は間違っていることが判明しました-コロンがない問題と同様に、テーブル名は実際placed_orderには であり、 はありませんs)。

彼らが何をしているのかを本当に理解せずに、両方の回答から前の質問へのコードをコピーしたようです。トリガーの設計ガイドライン(特に、データベース機能を複製しないことに関するもの) と、句を導入する構文をcreate trigger確認することをお勧めします。referencing

于 2013-05-12T16:26:25.007 に答える