我在上一篇文章(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;
delivery_date
是varchar2(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日。 但是,我得到的是。我哪里做错了?
下面是查询