在您修复“某事”(如评论所示)之后,现在您尝试插入的日期无效。这就是您正在做的事情(注意 SQL*Plus 如何指向发生错误的确切位置):
SQL> INSERT INTO employees(
2 employee_id,3 last_name,4 email,5 hire_date,6 job_id,7 department_id
8 )VALUES(
9 176,10 'Taylor',11 'jasontaylor@gmail.com',12 31-AUG-1999,13 'SA_REP',14 80
15 );
31-AUG-1999,*
ERROR at line 12:
ORA-00984: column not allowed here
看到了吗?您不能按字面意思插入 31-AUG-1999
。它看起来是我们人类的约会对象,但 - 事实并非如此。如果您尝试将其括在单引号中,则会出现另一个 - 不同 - 错误:
SQL> INSERT INTO employees(
2 employee_id,12 '31-AUG-1999',14 80
15 );
'31-AUG-1999',*
ERROR at line 12:
ORA-01858: a non-numeric character was found where a numeric was expected
SQL>
这有什么问题?是我的 NLS 设置无法识别这种格式。 Oracle 尝试将字符串(这就是 '31-AUG-1999'
)隐式转换为有效的 DATE 数据类型值,但失败了。
那么,怎么办?控制它!指定有效的 DATE 值,例如使用始终类似于 DATE 'YYYY-MM-DD'
:
的日期文字
SQL> INSERT INTO employees(
2 employee_id,12 DATE '1999-08-31',14 80
15 );
1 row created.
SQL>
或者,使用 TO_DATE
函数:
SQL> INSERT INTO employees(
2 employee_id,7 department_id
8 )VALUES(
9 177,12 to_date('31.08.1999','dd.mm.yyyy'),14 80
15 );
1 row created.
SQL>
或者,根据需要更改会话并设置 NLS 设置,但这不是一个好主意。您更愿意按照之前演示的方式进行操作:
SQL> alter session set nls_date_format = 'mon-yyyy-dd';
Session altered.
SQL> alter session set nls_date_language = 'croatian';
Session altered.
SQL> INSERT INTO employees(
2 employee_id,7 department_id
8 )VALUES(
9 178,12 'kol-1999-31',14 80
15 );
1 row created.
SQL>
,
用逗号将日期值括起来:
INSERT INTO employees (EMPLOYEE_ID,LAST_NAME,EMAIL,HIRE_DATE,JOB_ID,DEPARTMENT_ID)
VALUES(176,'Taylor','jasontaylor@gmail.com','31-AUG-1999','SA_REP',80);
见小提琴:
http://sqlfiddle.com/#!4/feb15f/1/0
本文链接:https://www.f2er.com/8064.html