Вы не упомянули, какую версию базы данных вы используете, поэтому ответ и выбранное вами решение могут отличаться.
Простым решением является использование последовательности . Вот пример. Сначала таблица:
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).