Warum bekomme ich ORA-01843: kein Gültiger Monat Fehler?

Ich habe gefragt, diese Frage in der früheren post ( https://stackoverflow.com/questions/16520216/ora-01843-not-a-valid-month ), aber den verändert, seit dann, und ich dachte, es wäre besser, um es klarer von Anfang an.

Ich erhalte diese Fehlermeldung beim ausführen einer Prozedur zum löschen eines Kunden aus einer Tabelle "Kunde".

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

Jedoch wenn ich löschen ein Kunde aus der customers-Tabelle ein trigger ausgelöst wird, die ist, wo ich denke, das problem liegt, hier ist der code für den trigger:

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;

Wenn ich jetzt löschen Sie einen Kunden, der hat nicht einen Datensatz in der placed_order Tabelle der Datensatz gelöscht wird feiner, die Fehlermeldung tritt auf, wenn versucht, löschen Sie einen Kunden, der hat einen Eintrag in der placed_order Tabelle. Also ich denke der Fehler tritt in der trigger als trigger wird nur zum einfügen von Werten in die previous_customer Tabelle, wenn Sie einen Datensatz in der placed_order Tabelle. Aber ich verstehe immer noch nicht, warum bekomme ich die Fehlermeldung ich tun?

Die customer-Tabelle hat keine anderen löst es auf.
Die Bestellung-Tabelle hat keine andere Trigger auf ihn und auch nicht das previous_employee

Die Struktur für die Tabelle Kunden ist :

"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

Die Struktur für placed_order ist:

"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

und die Struktur für previous_customer ist:

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

Jemand hat eine Idee warum bin ich immer die Fehlermeldung ORA-01843???

Der Prozedur-code:

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;
  • Nichts, was Sie zeigte, erklärt sich der Fehler. Suchen code, der versucht zu analysieren, eine der Spalten placed_order.delivery_date und placed_order.order_date in einem aktuellen Datum oder datetime-Objekt.
  • Warum glauben Sie, dass der trigger die Ursache des Problems? Wenn es keine DATE Spalten in den Tabellen oder in den code, scheint es höchst unwahrscheinlich, dass der Auslöser den Fehler verursacht. Warum ist der Auslöser einer autonomen Transaktion? Das ist fast sicher ein Fehler. Obwohl es wahrscheinlich nicht die Quelle von diesem bestimmten Fehler.
  • Wenn der trigger ausgelöst wird das problem dann einfach laufen... delete from Kunden where id = ... sollte das gleiche problem. Tut es das?
  • Hi @JustinCave, wenn ich nicht die autonome Transaktion line-in warf zurück placed_order ist mutation trigger/Funktion nicht gesehen werden können.
  • wenn ich das einfach löschen, für die ein Kunde nicht in der placed_order Tabelle löscht, wenn ich es mit einem Kunden mit einer Platte, die ich bekommen "ORA-06519: aktive autonome Transaktion erkannt und ein Rollback ORA-06512: at "C3283535.CUSTOMER_AD", line 21-ORA-04088: Fehler bei der Ausführung von trigger 'C3283535.CUSTOMER_AD'"
  • Es klingt wie Sie versuchen, falsch zu arbeiten, um ein mutating trigger-Fehler mit Hilfe von autonomen Transaktionen. Das ist nie ratsam. Es klingt wie Sie setzen viel mehr Logik in Triggern als es gehört -, dass die Logik im Allgemeinen gehört in gespeicherten Prozeduren statt. Nicht genau zu wissen, was Los ist an anderer Stelle in Ihrem system, ist es schwer zu viel in der Art von Besonderheiten. Aber Sie brauchen, um die Wurzel des Problems, nicht nur auf dem Papier über es durch Streuung autonomen Transaktion pragmas durch den code.
  • Was leistet die remove_customer Verfahren zu tun, und was ist der ganze Fehler-stack, wenn man das ORA-01843?
  • ive fügte der Zivilprozessordnung in der Spitze für Sie, es löscht einen Kunden nur zu, wenn Sie erhalten haben, Ihre Lieferung. Und im nicht sicher, wie um herauszufinden, die ganze Fehler-stack?
  • WRT Richards Kommentar (dem ich Zustimmen) check out oracle.com/technetwork/issue-archive/2008/08-sep/...
  • Können Sie dies ausführen... select * from user_triggers where table_name = 'CUSTOMER'; zu bestätigen, Sie haben keine andere trigger?
  • Angesichts der code wie gepostet, das einzige was ich mir vorstellen kann ist, dass irgendwie eine Zeile erstellt, in PLACED_ORDER, die hat ein ungültiges Datum in seiner DELIVERY_DATE Spalte. Jede Möglichkeit, die Zeilen werden in PLACED_ORDER mit seltsamen Dingen, die getan worden, um die DELIVERY_DATE? (Und mit "seltsam" meine ich Dinge wie das festlegen des JAHRES-Feld des Datum auf null).
  • Yep @dave nur ein Auslöser
  • aber ich denke, @alexPoole hat den Fehler gefunden

Schreibe einen Kommentar