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>