Stored procedures 在需要数字的位置找到非数字字符?

Stored procedures 在需要数字的位置找到非数字字符?,stored-procedures,oracle11g,Stored Procedures,Oracle11g,我创建了一个带有一些约束的插入过程。已成功创建过程,但当我尝试插入Im-01858时:在需要数字的位置发现了一个非数字字符。这是我的密码 CREATE TABLE Customers ( IDNumber INTEGER PRIMARY KEY, FirstName VARCHAR(50), LastName VARCHAR(50), DOB DATE, Gender CHAR(10) ); CREATE OR REPLACE PROCEDURE insertCustome

我创建了一个带有一些约束的插入过程。已成功创建过程,但当我尝试插入Im-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中,日期格式是正确的。如能在
中插入客户价值观(id、名字、姓氏、出生日期、性别),将不胜感激
您试图将
dob
作为char('1993年11月12日')插入,您需要将dob的插入值更改为
insert-INTO-Customers值(id、firstName、lastName、to_-DATE(dob)、性别)
这应该就可以了

正如前面所指出的,您的
截止日期('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')
中的am根据sysdate的当前值自动更改为pm或am


编辑:请注意,我是欧洲人,通常使用24小时格式,因此我不知道am/pm将如何处理此问题(发布前只运行了一个小测试),这取决于您的测试。

到目前为止('friday 10:00 am')
几乎肯定无效,如果要工作,几乎肯定不会做您想要的事情。如果您碰巧正确设置了
nls_date_格式
,它可能是有效的,但它不会解析到我猜您希望解析到的日期。因此,我如何修复sp以解决此问题取决于您尝试执行的操作。我不知道你为什么确定日期格式是正确的——这意味着你改变了
nls\u date\u格式,而你在文章中没有提到。如果我只是定期插入,我没有问题,但在执行sp时我会出错。我基本上希望sp检查工作日的时间是否在上午8点到上午5点之间,如果不显示错误消息