oracle11g - 是否可以插入具有相同用户和不同 ID 的多行
问题描述
我刚开始使用 Oracle-Sql 和 apex ,我偶然发现了另一个用户制作的这个代码/答案(归功于用户)并对其进行了一些调整。 http://sqlfiddle.com/#!4/fa7342/11
- 此代码创建由多个条件定义的“x”行/约会
我想要做的是插入表'x'行/约会:
- 相同的 user_id(不是 pk)
- 不同的约会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;
/
解决方案
让数据库生成主键更容易,因此您不必在代码中担心这一点。在下面的代码中,我使用标识列作为主键 - 在这种情况下,不需要手动创建序列。但是,如果您真的使用 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
)
;
推荐阅读
- node.js - 有没有办法通过发送您知道将被请求的数据来减少获取请求“浪费”的时间?
- python - 使用 py2neo 不返回节点的所有关系
- c# - 我可以编译数据集以便不需要原始数据库吗?[c#, .net 框架]
- ios - 仅横向向左滑动
- swift - 如何在后台更新核心数据后自动刷新 swiftUI 视图?
- git - 克隆一个分支,保留历史,删除其他仓库的附件
- ruby-on-rails - Webpacker 无法在 Dockerized Rails App 中编译
- javascript - 未捕获的 ReferenceError:addRecord 未在 HTMLButtonElement.onclick 中定义
- c - 即使在调用忽略它之后,C linux tcsetpgrp 也会停止父进程
- powershell - 使用密码压缩文件夹作为powershell