在预期数字的位置找到非数字字符?

时间:2016-03-25 19:19:02

标签: stored-procedures oracle11g

我创建了一个带有一些约束的插入过程。程序创建成功但当我尝试插入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中日期格式是正确的。任何见解将不胜感激

1 个答案:

答案 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>