Oracle PL/SQL 程序在源表中拆分逗号分隔的数据并推送到目标表中

Posted

技术标签:

【中文标题】Oracle PL/SQL 程序在源表中拆分逗号分隔的数据并推送到目标表中【英文标题】:Oracle PL/SQL Procedure to split comma separated data in source table and push in destination table 【发布时间】:2020-08-13 02:49:03 【问题描述】:

我使用正则表达式将逗号分隔的代码拆分为列,并将其插入目标表中。 我需要把它放在 pl/sql 过程中。 它应该首先清空目标表,然后在每次运行时填充。 它应该是一个循环并逐行插入。

数据库是 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,需要是分配给所有行的唯一编号。

【问题讨论】:

你已经做了所有的事情了吗?什么不工作?你尝试过任何类型的 pl/SQL 吗? 我需要把它放在 pl/sql 过程中。此插入用于一行。我需要对所有行执行此操作,例如循环。这将增加 rad_seq.nextval 列,此处的序列不起作用。所以我希望编写程序并添加循环,每行将递增 1。 so 创建过程,然后它会清空 dest_data 表,然后在循环中开始插入源表中的行,第一列 seq_id 以 1 递增。 分割没问题。我需要用循环将其包装在程序中,这就是我无法弄清楚的 【参考方案1】:

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

在 Oracle 12c 中,我们有两个选项可以在创建表本身时实现它,

选项 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,
  .....
  .....
);

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

编辑:-

忘了补充一点,如果是一次性活动,您不需要专门的程序,可以通过BEGINEND 中包含的匿名块来实现,如果您仍然需要一个程序,只需创建一个没有参数和过程主体内只需复制两个语句和一个没有任何循环的提交来生成序列。希望是明确的,否则请尝试提供反馈。

【讨论】:

以上是关于Oracle PL/SQL 程序在源表中拆分逗号分隔的数据并推送到目标表中的主要内容,如果未能解决你的问题,请参考以下文章

oracle 中报ora-30926 无法在源表中获得稳定的行 是怎么回事

使用 pl/sql 或 sql 将数据拆分到学生表中的多个列

使用pl / sql或sql在学生表的多个列中拆分数据

无法在源表中获得一组稳定的行?

错误:ORA-30926:无法在源表中获得一组稳定的行

合并给出错误 ORA-30926: 无法在源表中获得一组稳定的行