【问题标题】:SQL: Autogenerate generic id on record insertSQL:在记录插入时自动生成通用 ID
【发布时间】:2018-05-12 21:32:41
【问题描述】:

我开发了一个将顾问添加到表格的程序。

我想向顾问 ID 添加一个过程,以便每次将顾问添加到表中时,都会将通用 ID 添加到记录中。

如何创建此程序?

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;

【问题讨论】:

标签: sql oracle-apex-5.1


【解决方案1】:

您没有提及您使用的数据库版本,因此您选择的答案和解决方案可能会有所不同。

一个简单的解决方案是使用序列。这是一个例子。首先,一张表:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 2020-05-05
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多