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