SQL: автоматически генерировать универсальный идентификатор при вставке записи - PullRequest
0 голосов
/ 13 мая 2018

Я разработал процедуру, которая добавляет консультанта в таблицу.

Я хотел бы добавить процедуру к идентификатору консультанта, чтобы при каждом добавлении консультанта в таблицу в запись добавлялся общий идентификатор.

Как я могу создать эту процедуру?

create or replace PROCEDURE ADD_CONSULTANT
    ( p_con_id           LDS_CONSULTANT.CONSULTANT_ID%type,
      p_con_name         LDS_CONSULTANT.CST_NAME%type,
      p_con_start        LDS_CONSULTANT.START_DATE%type,
      p_con_end          LDS_CONSULTANT.LEAVE_DATE%type,
      p_con_loc          LDS_CONSULTANT.LOCATION%type,
      p_con_spec         LDS_CONSULTANT.SPECIALIST_AREA%type)
    IS
    BEGIN

    INSERT INTO LDS_CONSULTANT (CONSULTANT_ID, CST_NAME, START_DATE, LEAVE_DATE, LOCATION, SPECIALIST_AREA)
    VALUES (p_con_id, p_con_name, p_con_start, p_con_end, p_con_loc, p_con_spec);
    END;

1 Ответ

0 голосов
/ 13 мая 2018

Вы не упомянули, какую версию базы данных вы используете, поэтому ответ и выбранное вами решение могут отличаться.

Простым решением является использование последовательности . Вот пример. Сначала таблица:

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

...