是否可以插入具有相同用户和不同 ID 的多行
Is it possible to Insert multiple rows with same user and differrent id
我刚开始使用 Oracle-Sql 和 apex ,我无意中发现了另一个用户制作的 code/answer 并对其进行了一些调整。 http://sqlfiddle.com/#!4/fa7342/11
- 此代码创建 'x' rows/appointments 由多个条件定义
我想要做的是插入一个 table 'x' rows/appointments 和 :
- 相同user_id(非pk)
- 不同 appointment_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_DATE
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;
/
让数据库生成您的主键更容易,因此您不必在代码中担心这一点。在下面的代码中,我使用标识列作为主键——在这种情况下,不需要手动创建序列。但是,如果您真的使用 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 开始提供),那么您可以通过以下方式创建 table:
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
)
;
我刚开始使用 Oracle-Sql 和 apex ,我无意中发现了另一个用户制作的 code/answer 并对其进行了一些调整。 http://sqlfiddle.com/#!4/fa7342/11
- 此代码创建 'x' rows/appointments 由多个条件定义
我想要做的是插入一个 table 'x' rows/appointments 和 :
- 相同user_id(非pk)
- 不同 appointment_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_DATE | 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;
/
让数据库生成您的主键更容易,因此您不必在代码中担心这一点。在下面的代码中,我使用标识列作为主键——在这种情况下,不需要手动创建序列。但是,如果您真的使用 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 开始提供),那么您可以通过以下方式创建 table:
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
)
;