Plsql 用于拆分源表中逗号分隔的数据和推入目标表的Oracle PL/SQL过程

Plsql 用于拆分源表中逗号分隔的数据和推入目标表的Oracle PL/SQL过程,plsql,oracle12c,procedure,Plsql,Oracle12c,Procedure,我使用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_Str

我使用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, '(.*?)(,|$)', 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));

序列被用作第一列的主键,并且需要是分配给所有行的唯一编号。

考虑到插入数据已到位,并且只有列有问题,您需要自动递增

在Oracle 12c中,我们有两个选项可以在创建表时实现这一点

选项1:使用标识列

可以探索更多带有标识选项的选项

选项2:使用序列的默认值

在具有默认列值的地层中有更多

使用上述任何选项创建表后,请从insert语句中排除seq_id的插入,它将由oracle处理

编辑:-


忘了添加点,如果它是一次性活动,您不需要专用的过程,并且可以通过BEGIN END中包含的匿名块来实现,如果您仍然需要一个过程,只需在过程体中创建一个没有参数的过程,只需复制两条语句和一个commit,而不需要任何循环来生成序列。希望清楚,否则请尝试给出反馈。

您已经完成了所有工作?什么不起作用?您尝试过任何类型的pl/SQL吗?我需要将其放在pl/SQL过程中。此插入是针对一行的。我需要对所有行执行此操作,例如循环。这将增加rad_seq.nextval列,此处的序列不起作用。因此,我希望编写过程并添加循环,其中每行递增1。因此,创建过程,然后它将使用dest_数据表,然后在循环中开始插入源表中的行,第一列seq_id递增1。拆分很好。我需要用循环来包装这个过程,这是我无法理解的
CREATE TABLE dest_data (
  seq_id NUMBER GENERATED BY DEFAULT AS IDENTITY,
  .....
  .....
);
CREATE TABLE dest_data (
  seq_id NUMBER DEFAULT rad_seq.nextval,
  .....
  .....
);