问题描述
我已经使用regexp将逗号分隔的代码拆分为多个列,并将其插入到目标表中。 我需要将其放在pl / sql过程中。 它应该先清空目标表,然后在每次运行时填充它。 它应该是一个循环,并逐行插入。
DB是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,'(.*?)(,|$)',null,1)
from source_data
union all
select id,lvl + 1,regexp_substr(sep_String,1)
from rcte
where lvl <= regexp_count(data,',')
)
select *
from (
select rad_seq.nextval,id,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,并且必须是所有行的唯一编号assignEd。
解决方法
考虑到要插入的数据,只有该列的问题需要自动递增,
在Oracle 12c中,我们有两个选项可以在创建表本身时实现它,
选项1: 使用“身份列” 。
可以使用here浏览带有IDENTITY
选项的更多选项。
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,.....
.....
);
使用上述任何选项创建表后,请从插入语句中排除seq_id
的插入,并将由oracle处理。
编辑:-
忘记添加点了,如果这是一次活动,那么您不需要专用的过程,可以通过BEGIN
END
内的匿名块来实现,并且无论如何您都需要一个过程创建一个不带参数的语句,并在过程主体内复制两个语句和一个提交,而无需任何循环即可生成序列。希望清楚,否则请尝试提供反馈。