首页 > 解决方案 > 是否可以插入具有相同用户和不同 ID 的多行

问题描述

我刚开始使用 Oracle-Sql 和 apex ,我偶然发现了另一个用户制作的这个代码/答案(归功于用户)并对其进行了一些调整。 http://sqlfiddle.com/#!4/fa7342/11

我想要做的是插入表'x'行/约会:

  1. 相同的 user_id(不是 pk)
  2. 不同的约会ID(pk - 序列并增加'x'约会')

如果输入是:

interval_type VARCHAR2(20) := 'daily';
  start_date    DATE         := DATE '2021-07-15';
  number_of_appointments number := 3;
  appointent_id_number number := sequence.nextval;
  id_client number := 1012;

输出应该是:

约会日期 APPOINTMENT_ID ID_CLIENT
2021-07-16T00:00:00Z 1 1012
2021-07-17T00:00:00Z 2 1012
2021-07-18T00:00:00Z 3 1012

询问 :

DECLARE
  interval_type VARCHAR2(20) := 'daily';
  start_date    DATE         := DATE '2021-07-15';
  number_of_appointments number := 3;
  appointent_id_number number := sequence.nextval
  id_client number := 1012;
BEGIN
  INSERT INTO table_name (appointment_date)
  SELECT CASE interval_type
         WHEN 'daily'
         THEN start_date + INTERVAL '1' DAY * LEVEL
         WHEN 'weekly'
         THEN start_date + INTERVAL '7' DAY * LEVEL
         WHEN 'monthly'
         THEN ADD_MONTHS( start_date, LEVEL )
         END
  FROM   DUAL
  CONNECT BY
         LEVEL <= number_of_appointments;
END;
/

标签: oracle11goracle-sqldeveloperoracle-apex

解决方案


让数据库生成主键更容易,因此您不必在代码中担心这一点。在下面的代码中,我使用标识列作为主键 - 在这种情况下,不需要手动创建序列。但是,如果您真的使用 11g(考虑升级 - 该版本非常非常旧)身份列将不起作用。该案例的代码在底部。

create table appointments_table (
    id                             number generated by default on null as identity 
                                   constraint appointments_table_id_pk primary key,
    appointment_date               date,
    id_client                      number
)
;

DECLARE
  interval_type VARCHAR2(20) := 'daily';
  start_date    DATE         := DATE '2021-07-15';
  number_of_appointments number := 3;
  l_id_client number := 1012;
BEGIN
  INSERT INTO appointments_table (appointment_date, id_client)
  SELECT CASE interval_type
         WHEN 'daily'
         THEN start_date + INTERVAL '1' DAY * LEVEL
         WHEN 'weekly'
         THEN start_date + INTERVAL '7' DAY * LEVEL
         WHEN 'monthly'
         THEN ADD_MONTHS( start_date, LEVEL )
         END,
         l_id_client
  FROM   DUAL
  CONNECT BY
         LEVEL <= number_of_appointments;
END;
/

select * from appointments_table;

        ID APPOINTMENT  ID_CLIENT
---------- ----------- ----------
         1 16-JUL-2021       1012
         2 17-JUL-2021       1012
         3 18-JUL-2021       1012

如果您使用的 oracle 版本不支持标识列(从 12.1 开始提供),那么您可以通过以下方式创建表:

create sequence appointments_table_seq;

create table appointments_table (
    id                             number default appointments_table_seq.NEXTVAL 
                                   constraint appointments_table_id_pk primary key,
    appointment_date_dt            date,
    id_client                      number
)
;


推荐阅读