0

以前の投稿 ( https://stackoverflow.com/questions/16520216/ora-01843-not-a-valid-month )でこの質問をしましたが、それ以来変更されており、作成した方がよいと思いました。最初からクリア。

顧客テーブルから顧客を削除する手順を実行すると、このエラーが発生します。

BEGIN 
customers.remove_customer('17023');
END;

ただし、顧客テーブルから顧客を削除すると、問題があると思われるトリガーが起動します。トリガーのコードは次のとおりです。

create or replace TRIGGER CUSTOMER_AD
  BEFORE DELETE ON CUSTOMER
  REFERENCING OLD AS OLD
  FOR EACH ROW
DECLARE
pragma autonomous_transaction;
nPlaced_order_count  NUMBER;
BEGIN
SELECT COUNT(*)
INTO nPlaced_order_count
FROM PLACED_ORDER 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)
VALUES
(:old.customer_id,
:old.first_name,
:old.last_name,
:old.address);
END IF;
END CUSTOMER_AD;

ここで、placed_order テーブルにレコードを持っていない顧客を削除すると、レコードは正常に削除されます。placed_order テーブルにレコードがある顧客を削除しようとすると、エラー メッセージが表示されます。したがって、トリガーは、placed_order テーブルにレコードがある場合に限り、previous_customer テーブルに値を挿入するため、トリガーでエラーが発生すると思います。しかし、なぜエラーメッセージが表示されるのかまだわかりませんか?

customer テーブルには、他のトリガーはありません。発注テーブルには他のトリガーがなく、previous_employee にもありません。

顧客テーブルの構造は次のとおりです。

"CUSTOMER_ID" VARCHAR2(40) NOT NULL ENABLE, 
"FIRST_NAME" VARCHAR2(30), 
"LAST_NAME" VARCHAR2(30), 
"ADDRESS" VARCHAR2(30) 
CONSTRAINT "PK_CUSTOMER" PRIMARY KEY ("CUSTOMER_ID") ENABLE

placed_order の構造は次のとおりです。

"ORDER_ID" NUMBER(*,0) NOT NULL ENABLE, 
"ORDER_DATE" VARCHAR2(15), 
"DELIVERY_DATE" VARCHAR2(15), 
"FK1_CUSTOMER_ID" VARCHAR2(40) NOT NULL ENABLE, 
CONSTRAINT "PK_PLACED_ORDER" PRIMARY KEY ("ORDER_ID") ENABLE

ALTER TABLE  "PLACED_ORDER" ADD CONSTRAINT "FK1_PLACED_ORDER_TO_CUSTOMER" FOREIGN KEY ("FK1_CUSTOMER_ID")
      REFERENCES  "CUSTOMER" ("CUSTOMER_ID") ON DELETE CASCADE ENABLE

また、previous_customer の構造は次のとおりです。

"CUSTOMER_ID" VARCHAR2(40), 
"FIRST_NAME" VARCHAR2(30), 
"LAST_NAME" VARCHAR2(30), 
"ADDRESS" VARCHAR2(30)

エラーメッセージORA-01843が表示される理由は誰にも分かりますか???

プロシージャ コードは次のとおりです。

PROCEDURE remove_customer (customer_id VARCHAR2) IS
   ordersCount pls_integer;
BEGIN
   select count(*) into ordersCount
   from placed_order
   where fk1_customer_id = remove_customer.customer_id
   and delivery_date > sysdate;
IF ordersCount > 0
THEN
DBMS_OUTPUT.PUT_LINE ('Customer currently has a order been delivered and cant be deleted');
ELSE
DELETE FROM customer
WHERE customer.customer_id = remove_customer.customer_id;
total_customers := total_customers - 1;
END IF;
END;
4

1 に答える 1