Oracle 中部门 ID 的标识符无效 SQL
Invalid Identifier for Department ID in Oracle SQL
代码似乎没问题,但由于某些无法解释的原因,我无法将值插入 table。我只想插入特定值,但由于某种原因它显示为无效
Table:
CREATE TABLE employees
(
EMPLOYEE_ID NUMBER(6) PRIMARY KEY NOT NULL,
FIRST_NAME VARCHAR(20),
LAST_NAME VARCHAR(25) NOT NULL,
EMAIL VARCHAR(25) NOT NULL,
PHONE_NUMBER VARCHAR(20),
HIRE_DATE DATE NOT NULL,
JOB_ID VARCHAR2(10) NOT NULL,
SALARY NUMBER(8,2),
COMMISSION_PCT NUMBER(2,2),
MANAGER_ID NUMBER(6),
DEPARTMENT_ID NUMBER(4)
);
Table 已创建并正常工作
当它被添加到错误的地方时:
INSERT INTO employee (EMPLOYEE_ID, LAST_NAME, JOB_ID, DEPARTMENT_ID)
VALUES(176, 'Taylor', 'SA_REP', 80);
希望我能得到答案
用逗号括起日期值:
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);
参见fiddle:
http://sqlfiddle.com/#!4/feb15f/1/0
在您修复“某事”(如评论所建议的)之后,现在是关于您尝试插入的无效日期。这就是您正在做的事情(注意 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,
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-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,
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 DATE '1999-08-31',
13 'SA_REP',
14 80
15 );
1 row created.
SQL>
或者,使用TO_DATE
函数:
SQL> INSERT INTO employees(
2 employee_id,
3 last_name,
4 email,
5 hire_date,
6 job_id,
7 department_id
8 )VALUES(
9 177,
10 'Taylor',
11 'jasontaylor@gmail.com',
12 to_date('31.08.1999', 'dd.mm.yyyy'),
13 'SA_REP',
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,
3 last_name,
4 email,
5 hire_date,
6 job_id,
7 department_id
8 )VALUES(
9 178,
10 'Taylor',
11 'jasontaylor@gmail.com',
12 'kol-1999-31',
13 'SA_REP',
14 80
15 );
1 row created.
SQL>
代码似乎没问题,但由于某些无法解释的原因,我无法将值插入 table。我只想插入特定值,但由于某种原因它显示为无效
Table:
CREATE TABLE employees
(
EMPLOYEE_ID NUMBER(6) PRIMARY KEY NOT NULL,
FIRST_NAME VARCHAR(20),
LAST_NAME VARCHAR(25) NOT NULL,
EMAIL VARCHAR(25) NOT NULL,
PHONE_NUMBER VARCHAR(20),
HIRE_DATE DATE NOT NULL,
JOB_ID VARCHAR2(10) NOT NULL,
SALARY NUMBER(8,2),
COMMISSION_PCT NUMBER(2,2),
MANAGER_ID NUMBER(6),
DEPARTMENT_ID NUMBER(4)
);
Table 已创建并正常工作 当它被添加到错误的地方时:
INSERT INTO employee (EMPLOYEE_ID, LAST_NAME, JOB_ID, DEPARTMENT_ID)
VALUES(176, 'Taylor', 'SA_REP', 80);
希望我能得到答案
用逗号括起日期值:
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);
参见fiddle: http://sqlfiddle.com/#!4/feb15f/1/0
在您修复“某事”(如评论所建议的)之后,现在是关于您尝试插入的无效日期。这就是您正在做的事情(注意 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,
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-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,
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 DATE '1999-08-31',
13 'SA_REP',
14 80
15 );
1 row created.
SQL>
或者,使用TO_DATE
函数:
SQL> INSERT INTO employees(
2 employee_id,
3 last_name,
4 email,
5 hire_date,
6 job_id,
7 department_id
8 )VALUES(
9 177,
10 'Taylor',
11 'jasontaylor@gmail.com',
12 to_date('31.08.1999', 'dd.mm.yyyy'),
13 'SA_REP',
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,
3 last_name,
4 email,
5 hire_date,
6 job_id,
7 department_id
8 )VALUES(
9 178,
10 'Taylor',
11 'jasontaylor@gmail.com',
12 'kol-1999-31',
13 'SA_REP',
14 80
15 );
1 row created.
SQL>