我创建了一个带有一些约束的插入过程。程序创建成功但当我尝试插入Im得到ORA-01858时:找到了一个非数字字符,其中数字是预期的。这是我的代码
CREATE TABLE Customers
(
IDNumber INTEGER PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
DOB DATE,
Gender CHAR(10)
);
CREATE OR REPLACE PROCEDURE insertCustomer (id IN Integer, firstName IN varchar, lastName IN varchar, dob IN date, gender varchar)
AS
BEGIN
If sysdate between to_date('monday 08:00 am') and to_date('monday 05:00 pm')
or sysdate between to_date('tuesday 08:00 am') and to_date('tuesday 05:00 pm')
or sysdate between to_date('wednesday 08:00 am') and to_date('wednesday 05:00 pm')
or sysdate between to_date('thursday 08:00 am') and to_date('thursday 05:00 pm')
or sysdate between to_date('friday 10:00 am') and to_date('friday 01:00 pm')
then
INSERT INTO Customers values(id, firstName, lastName, dob, gender);
ELSE
raise_application_error(-20101, 'Can only insert during the week between normal business hours');
END if;
END insertCustomer
;
/
execute insertCustomer (18, 'Andre', 'Walker', '12-NOV-1993', 'male');
我已经被困了一段时间了。我确信在oracle中日期格式是正确的。任何见解将不胜感激
答案 0 :(得分:0)
在INSERT INTO Customers values(id, firstName, lastName, dob, gender);
您尝试插入dob
作为字符('12 -NOV-1993'),您需要将dob的插入值更改为INSERT INTO Customers values(id, firstName, lastName, TO_DATE(dob), gender);
,这应该是诀窍。
同样如前所述,您的to_date('monday 08:00 am')
肯定不正确,会导致“Julian date”错误。
这是您尝试做的事情的另一种方式
IF TO_CHAR(sysdate, 'D') IN (1,2,3,4) AND TO_CHAR(sysdate, 'HH:MI am') BETWEEN '08:00 am' AND '05:00 pm' THEN
INSERT...
ELSIF TO_CHAR(sysdate, 'D') = 5 AND TO_CHAR(sysdate, 'HH:MI am') BETWEEN '10:00 am' AND '01:00 pm' THEN
INSERT...
ELSE
RAISE_APPLICATION_ERROR
END IF;
其中整数表示“星期几”,而TO_CHAR(sysdate, 'HH:MI am')
中的上午自动更改为pm或am,具体取决于sysdate的当前值。
编辑:请注意我是欧洲人并且通常使用24小时格式,所以我不知道上午/下午将如何处理这个(在发布之前只进行了一次小测试),这取决于你进行测试。 / p>