您没有提及您使用的数据库版本,因此您选择的答案和解决方案可能会有所不同。
一个简单的解决方案是使用序列。这是一个例子。首先,一张表:
SQL> CREATE TABLE lds_consultant (
2 consultant_id NUMBER,
3 cst_name VARCHAR2(20),
4 start_date DATE,
5 leave_date DATE,
6 location VARCHAR2(20),
7 specialist_area VARCHAR2(20)
8 );
Table created.
一个序列:
SQL> CREATE SEQUENCE seq_cons;
Sequence created.
一个程序;我删除了您最初使用的参数,因为您不再需要它了。
SQL> CREATE OR REPLACE PROCEDURE add_consultant (
2 p_con_name lds_consultant.cst_name%TYPE,
3 p_con_start lds_consultant.start_date%TYPE,
4 p_con_end lds_consultant.leave_date%TYPE,
5 p_con_loc lds_consultant.location%TYPE,
6 p_con_spec lds_consultant.specialist_area%TYPE
7 )
8 IS
9 BEGIN
10 INSERT INTO lds_consultant (
11 consultant_id,
12 cst_name,
13 start_date,
14 leave_date,
15 location,
16 specialist_area
17 ) VALUES (
18 seq_cons.NEXTVAL, --> this
19 p_con_name,
20 p_con_start,
21 p_con_end,
22 p_con_loc,
23 p_con_spec
24 );
25 END;
26 /
Procedure created.
让我们测试一下:
SQL> BEGIN
2 add_consultant('Littlefoot',trunc(SYSDATE),NULL,'Croatia','IT');
3 END;
4 /
PL/SQL procedure successfully completed.
SQL> SELECT * FROM lds_consultant;
CONSULTANT_ID CST_NAME START_DATE LEAVE_DATE LOCATION SPECIALIST_AREA
------------- -------------------- ---------- ---------- -------------------- --------------------
1 Littlefoot 13.05.2018 Croatia IT
SQL>
另一个选项是数据库触发器:
SQL> CREATE OR REPLACE TRIGGER trg_bi_cons BEFORE
2 INSERT ON lds_consultant
3 FOR EACH ROW
4 BEGIN
5 :new.consultant_id := seq_cons.nextval;
6 END;
7 /
Trigger created.
与前面的示例不同,您甚至不需要再引用consultant_id,因为触发器可以完成这项工作。
SQL> CREATE OR REPLACE PROCEDURE add_consultant (
2 p_con_name lds_consultant.cst_name%TYPE,
3 p_con_start lds_consultant.start_date%TYPE,
4 p_con_end lds_consultant.leave_date%TYPE,
5 p_con_loc lds_consultant.location%TYPE,
6 p_con_spec lds_consultant.specialist_area%TYPE
7 )
8 IS
9 BEGIN
10 INSERT INTO lds_consultant (
11 cst_name,
12 start_date,
13 leave_date,
14 location,
15 specialist_area
16 ) VALUES (
17 p_con_name,
18 p_con_start,
19 p_con_end,
20 p_con_loc,
21 p_con_spec
22 );
23
24 END;
25 /
Procedure created.
测试:
SQL> BEGIN
2 add_consultant('Bigfoot',trunc(SYSDATE),NULL,'France','Fashion');
3 END;
4 /
PL/SQL procedure successfully completed.
SQL> SELECT * FROM lds_consultant;
CONSULTANT_ID CST_NAME START_DATE LEAVE_DATE LOCATION SPECIALIST_AREA
------------- -------------------- ---------- ---------- -------------------- --------------------
1 Littlefoot 13.05.2018 Croatia IT
2 Bigfoot 13.05.2018 France Fashion
SQL>
如果您使用的是 12c 数据库版本,请使用身份列:
CREATE TABLE lds_consultant (
consultant_id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,,
cst_name VARCHAR2(20),
start_date DATE,
leave_date DATE,
location VARCHAR2(20),
specialist_area VARCHAR2(20)
);
该过程类似于第二个(触发)示例中的过程,即您不需要引用 consultant_id 列。当我在笔记本电脑上运行 11g XE 时,我无法发布执行,但我相信如果有必要,您可以自己执行(当然,如果您使用的是 12c)。