Oracle PL/SQL 在源 table 中拆分逗号分隔数据并推入目标 table 的过程
Oracle PL/SQL Procedure to split comma separated data in source table and push in destination table
我使用正则表达式将逗号分隔的代码拆分为列并将其插入目标 table。
我需要把它放在 pl/sql 过程中。
它应该首先清空目标 table,然后在每次 运行 时填充。
应该是一个循环,逐行插入。
数据库是 Oracle 12c。
Delete from dest_data;
insert into dest_data(seq_id,rad_id,column_1,column_2,column_3,column_4,column_5,column_6,column_7)
with rcte (id, sep_String, lvl, result) as (
select rad_id, string, 1, regexp_substr(string, '(.*?)(,|$)', 1, 1, null, 1)
from source_data
union all
select id, sep_String, lvl + 1, regexp_substr(sep_String, '(.*?)(,|$)', 1, lvl + 1, null, 1)
from rcte
where lvl <= regexp_count(data, ',')
)
select *
from (
select rad_seq.nextval,id, lvl, result --here i wish to use sequence but am not able to--
from rcte
)
pivot (max(result) as col for (lvl) in (1, 2, 3, 4, 5, 6, 7));
序列用作第一列 pk 并且需要是分配给所有行的唯一编号。
考虑到要插入的数据已经到位,只有列的问题需要自动递增,
在 Oracle 12c 中,我们在创建 table 本身时有两种选择来实现它,
选项 1:使用标识列。
可以探索具有 IDENTITY
个选项的更多选项 here。
CREATE TABLE dest_data (
seq_id NUMBER GENERATED BY DEFAULT AS IDENTITY,
.....
.....
);
选项 2: 使用序列的默认值
具有默认列值的编队中有更多内容here
CREATE TABLE dest_data (
seq_id NUMBER DEFAULT rad_seq.nextval,
.....
.....
);
使用上述任何选项创建 table 后,从插入语句中排除 seq_id
的插入,它将由 oracle 处理。
编辑:-
忘了补充一点,如果是一次性 activity 你不需要专门的程序,可以通过包含在 BEGIN
END
中的匿名块来实现,如果无论如何,您都需要一个过程,只需创建一个没有参数的过程,然后在过程主体中复制两个语句和一个没有任何循环的提交即可生成序列。希望清楚,否则请尝试提供反馈。
我使用正则表达式将逗号分隔的代码拆分为列并将其插入目标 table。 我需要把它放在 pl/sql 过程中。 它应该首先清空目标 table,然后在每次 运行 时填充。 应该是一个循环,逐行插入。
数据库是 Oracle 12c。
Delete from dest_data;
insert into dest_data(seq_id,rad_id,column_1,column_2,column_3,column_4,column_5,column_6,column_7)
with rcte (id, sep_String, lvl, result) as (
select rad_id, string, 1, regexp_substr(string, '(.*?)(,|$)', 1, 1, null, 1)
from source_data
union all
select id, sep_String, lvl + 1, regexp_substr(sep_String, '(.*?)(,|$)', 1, lvl + 1, null, 1)
from rcte
where lvl <= regexp_count(data, ',')
)
select *
from (
select rad_seq.nextval,id, lvl, result --here i wish to use sequence but am not able to--
from rcte
)
pivot (max(result) as col for (lvl) in (1, 2, 3, 4, 5, 6, 7));
序列用作第一列 pk 并且需要是分配给所有行的唯一编号。
考虑到要插入的数据已经到位,只有列的问题需要自动递增,
在 Oracle 12c 中,我们在创建 table 本身时有两种选择来实现它,
选项 1:使用标识列。
可以探索具有 IDENTITY
个选项的更多选项 here。
CREATE TABLE dest_data (
seq_id NUMBER GENERATED BY DEFAULT AS IDENTITY,
.....
.....
);
选项 2: 使用序列的默认值
具有默认列值的编队中有更多内容here
CREATE TABLE dest_data (
seq_id NUMBER DEFAULT rad_seq.nextval,
.....
.....
);
使用上述任何选项创建 table 后,从插入语句中排除 seq_id
的插入,它将由 oracle 处理。
编辑:-
忘了补充一点,如果是一次性 activity 你不需要专门的程序,可以通过包含在 BEGIN
END
中的匿名块来实现,如果无论如何,您都需要一个过程,只需创建一个没有参数的过程,然后在过程主体中复制两个语句和一个没有任何循环的提交即可生成序列。希望清楚,否则请尝试提供反馈。