SQL 查询给出错误消息没有足够的值

问题描述 投票:0回答:1
-- table script
CREATE TABLE employees
( 
    EMPLOYEE_ID NUMBER(6) NOT NULL, 
    FIRST_NAME  VARCHAR2(20),
    LAST_NAME VARCHAR2(25) NOT NULL,
    SALARY NUMBER(8,2),
    HIREDATE DATE,
    DEPARTMENT_ID NUMBER(4)
);

CREATE SEQUENCE emp_seq  --Sequence creation
     START WITH 1
     INCREMENT BY 1
     NOCACHE;

问题:当我尝试运行此插入查询时,出现错误“值不足”:

INSERT INTO employees (employee_id, last_name, hiredate)
VALUES ((SELECT emp_seq.nextval, 'Smith', SYSDATE FROM dual));

有人能解释一下为什么吗?

我尝试单独运行嵌套选择语句,获得所需的结果,但是当同时尝试这两个查询时,我收到了该错误。

sql oracle
1个回答
0
投票

示例表和顺序:

SQL> CREATE TABLE employees(
  2    employee_id   NUMBER(6) NOT NULL, ---table script
  3    first_name    VARCHAR2(20),
  4    last_name     VARCHAR2(25) NOT NULL,
  5    salary        NUMBER(8,2),
  6    hiredate      DATE,
  7    department_id NUMBER(4));

Table created.

SQL> CREATE SEQUENCE emp_seq  --Sequence creation
  2    START WITH 1
  3    INCREMENT BY 1
  4    NOCACHE;

Sequence created.

确实,你的

insert
不起作用,因为......

SQL> INSERT INTO employees
  2    (employee_id, last_name, hiredate)
  3     VALUES ( (SELECT emp_seq.NEXTVAL, 'Smith', sysdate FROM dual) );
   VALUES ( (SELECT emp_seq.NEXTVAL, 'Smith', sysdate FROM dual) )
             ----------------------------------------------------
             ... all of this is considered to be employee_id
   *
ERROR at line 3:
ORA-00947: not enough values

但是,如果你这样说:

SQL> INSERT INTO employees
  2    (employee_id, last_name, hiredate)
  3    (SELECT emp_seq.NEXTVAL, 'Smith', sysdate FROM dual);

1 row created.

或者这个:

SQL>  INSERT INTO employees
  2    (employee_id, last_name, hiredate)
  3     VALUES ( emp_seq.NEXTVAL, 'Jones', sysdate );

1 row created.

然后就可以了。

SQL> SELECT * FROM employees;

EMPLOYEE_ID FIRST_NAME           LAST_NAME                     SALARY HIREDATE            DEPARTMENT_ID
----------- -------------------- ------------------------- ---------- ------------------- -------------
          1                      Smith                                27.10.2024 10:03:44
          2                      Jones                                27.10.2024 10:03:57

SQL>

另一方面,如果您的数据库版本允许(我猜/希望您不是使用 11g 或更低版本?),您可以使用标识列并让 Oracle 处理 ID:

SQL> DROP TABLE employees;

Table dropped.

SQL> CREATE TABLE employees(
  2    employee_id   NUMBER(6) GENERATED ALWAYS AS IDENTITY NOT NULL, ---table script
  3    first_name    VARCHAR2(20),
  4    last_name     VARCHAR2(25) NOT NULL,
  5    salary        NUMBER(8,2),
  6    hiredate      DATE,
  7    department_id NUMBER(4));

Table created.

SQL> INSERT INTO employees
  2    (last_name, hiredate)
  3     VALUES ('Smith', sysdate );

1 row created.

SQL> SELECT * FROM employees;

EMPLOYEE_ID FIRST_NAME           LAST_NAME                     SALARY HIREDATE            DEPARTMENT_ID
----------- -------------------- ------------------------- ---------- ------------------- -------------
          1                      Smith                                27.10.2024 10:09:18

SQL>
© www.soinside.com 2019 - 2024. All rights reserved.