当前位置: 首页 > 知识库问答 >
问题:

为什么我得到ORA-01843:不是一个有效的月份错误?

诸福
2023-03-14

我在上一篇文章(https://stackoverflow.com/questions/16520216/ora-01843-not-a-valide-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表中有记录的客户时,会出现错误消息。因此,我认为错误发生在触发器中,因为触发器只在previous_customer表中有记录的情况下将值插入到previous_customer表中。但我还是不明白为什么我会得到错误消息?

customer表上没有其他触发器。放置的订单表上没有其他触发器,previous_employee也没有

customers表的结构为:

"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
"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
"CUSTOMER_ID" VARCHAR2(40), 
"FIRST_NAME" VARCHAR2(30), 
"LAST_NAME" VARCHAR2(30), 
"ADDRESS" VARCHAR2(30)

程序代码为:

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;

共有1个答案

佟涵畅
2023-03-14

delivery_datevarchar2(15)。您的过程包括:

and delivery_date > sysdate;

...这将导致根据会话的NLS_DATE_FORMAT将表中的Delivery_DATE值隐式转换为DATE类型。如果你有一个“日期”在那里,但不是在该格式,那么你会得到这个错误。例如,如果您的NLS_DATE_FORMAT是mm/dd/yyyy,正如您在上一个问题中所说,并且您以前在表中存储了一个日期为dd/mm/yyyy,例如'13/05/2013',那么它将从隐式转换中得到此错误。

它可能有点断断续续;如果在placed_order中没有客户的数据,那么就没有要(尝试)转换的日期。

所以和扳机无关。反正触发器似乎毫无意义;为什么不在此过程中插入previous_customer?你可以这样做:

ELSE
    INSERT INTO previous_customer(customer_id, first_name, last_name, address)
    SELECT customer_id, first_name, last_name, address)
    FROM customer
    WHERE customer_id = remove_customer.customer_id;

    DELETE FROM customer
    WHERE customer.customer_id = remove_customer.customer_id;

    total_customers := total_customers - 1;
END IF;

...忘了扳机。

正是由于这个原因,您不应该将日期存储在文本字段中。如果您不能将placed_order字段更改为date类型--您确实应该这样做--您必须假设它们中的数据是标准格式的,并且它与您的格式不匹配,在这种情况下,您可以(正如Bob所说的)根据自己的条件强制转换:

and to_date(delivery_date, 'dd/mm/yyyy') > sysdate
and to_date(delivery_date, 'dd/mm/yyyy HH24:MI:SS') > sysdate

您的意思是>sysdate吗?I它是在at项目实际交付时填充的,还是显示预期的交付日期?该错误是奇怪的,如果您不能删除尚未交付的订单,或者已经交付了任何订单,则ODESN没有明确表示,在这种情况下Delivery_Date不为NULL可能已经足够了。

 类似资料:
  • 请帮忙。我在这里犯了一个小错误,但即使看了前面的问题,我也找不到它。 查询运行时没有错误,但是当我从结果中选择所有数据时(通过执行Ctrl+a),我得到ORA-1843:不是一个有效的月份。 谢谢你。 此外,我被错误的数据模型所困扰。此日期字段的值如“0--”,月份值大于12,最后天大于31。现在我想在选择期间忽略这些记录。我创建的存储过程不能正常工作,请提供帮助。谢了。

  • 我使用以下查询创建了一个表 现在,当我尝试使用SQL错误:ORA-01843:not a valid month。 我做错了什么?

  • 我为PHP更改了OCI8版本,由于该查询不起作用: 我收到这个消息: 消息:oci_execute():ora-01843:不是有效月份 它与Toad一起用于Oracle11。你有什么解决办法吗? 谢谢:)

  • 我有一个在PL-SQL视图中使用的查询。该视图包含一个名为Jde_date的函数,该函数采用Julian格式的date参数并将其转换为Gregorian格式,它工作得很好。 查询如下: 但是当我发布报告时,我得到错误ORA-01843:不是一个有效的月份。 我该怎么解决?

  • 我在Oracle DB中有一个列,它是数据类型。存储在此列中的典型值类似于。我试图得到所有的记录,其中该专栏有记录后2015年8月1日。 但是,我得到的是。我哪里做错了?