Oracle Procedure unpivot data into destination 使用现有过程中使用的数据拆分逻辑

Oracle Procedure unpivot data into destination using data splitting logic used in existing procedure

我有一个 PL/SQL 过程,它在运行时获取逗号分隔的字符串,将其拆分并推入 table。 此处给出了过程示例和 table: 程序是push_data。 当前 table 插入数据的位置是 push_data_temp.

现在根据要求,我需要编写一个新程序,其中逻辑将与拆分数据保持相同,但在新的 table push_data_pivot(数据透视内的结构)中,应该显示数据以这种格式旋转。

例如:如果 push_data_temp 中的当前数据是:

新程序中的数据应进入 push_data_pivot 为:

逻辑应该保持不变,只是插入的数据将进入列而不是行,填充 id 和 value 列。

此处的列 id 是在两个 table 中传递的字符串的唯一标识符。基本上和原来table.

用的一样

无法为 push_data_pivot 结构更新 fiddle,因此请在此处提及最新的结构和数据: PUSH_DATA_PIVOT :

create table PUSH_DATA_PIVOT
(
id_pk NUMBER,
  id NUMBER,
  label_id number,
  label varchar2(4000),
  value varchar2(4000)
);

insert into push_data_pivot values(1,null,'COL01',null);
insert into push_data_pivot values(1,null,'COL02',null);
insert into push_data_pivot values(1,null,'COL03',null);
insert into push_data_pivot values(1,null,'COL04',null);
insert into push_data_pivot values(1,null,'COL05',null);
insert into push_data_pivot values(1,null,'COL06',null);
insert into push_data_pivot values(1,null,'COL07',null);
insert into push_data_pivot values(1,null,'COL08',null);
insert into push_data_pivot values(1,null,'COL09',null);
insert into push_data_pivot values(1,null,'COL10',null);
insert into push_data_pivot values(1,null,'COL11',null);
insert into push_data_pivot values(1,null,'COL12',null);
insert into push_data_pivot values(1,null,'COL13',null);
insert into push_data_pivot values(1,null,'COL14',null);

示例数据是单个字符串,对于单个label_id和对应的一组列标签values.However,实际table会在id列的基础上插入多个这样的字符串,同上原始要求。这已在现有过程中使用游标进行处理。

唯一的要求是,以新目标 table 作为 push_data_pivot 和非透视格式的数据创建新过程。拆分逻辑与现有程序相同。

如果 PUSH_DATA_TEMP 中的列列表是固定的,那么标准的 UNPIVOT 将满足所有需要,例如

SQL> create table push_data_temp
  2   ( id  int,
  3     col1 varchar2(20),
  4     col2 varchar2(20),
  5     col3 varchar2(20),
  6     col4 varchar2(20),
  7     col5 varchar2(20),
  8     col6 varchar2(20),
  9     col7 varchar2(20),
 10     col8 varchar2(20),
 11     col9 varchar2(20),
 12     col10 varchar2(20),
 13     col11 varchar2(20),
 14     col12 varchar2(20),
 15     col13 varchar2(20),
 16     col14 varchar2(20)
 17  );

Table created.

SQL>
SQL> insert into push_data_temp values
  2   (1,'c1data','c2data','c3data','c4data','c5data','c6data','c7data',
  3      'c8data','c9data','c10data','c11data','c12data','c13data','c14data' );

1 row created.

SQL>
SQL> insert into push_data_temp values
  2   (2,'c1dataX','c2dataX','c3dataX','c4dataX','c5dataX','c6dataX','c7dataX',
  3      'c8dataX','c9dataX','c10dataX','c11dataX','c12dataX','c13dataX','c14dataX' );

1 row created.

SQL>

逆轴...

SQL> select *
  2  from   push_data_temp
  3  unpivot (value for label
  4    IN (col1 AS 'COL-1', col2 AS 'COL-2',col3 AS 'COL-3',col4 AS 'COL-4',col5 AS 'COL-5',col6 AS 'COL-6',col7 AS 'COL-7',
  5        col8 AS 'COL-8',col9 AS 'COL-9',col10 AS 'COL-10',col11 AS 'COL-11',col12 AS 'COL-12',col13 AS 'COL-13',col14 AS 'COL-14'
  6    ));

        ID LABEL  VALUE
---------- ------ --------------------
         1 COL-1  c1data
         1 COL-2  c2data
         1 COL-3  c3data
         1 COL-4  c4data
         1 COL-5  c5data
         1 COL-6  c6data
         1 COL-7  c7data
         1 COL-8  c8data
         1 COL-9  c9data
         1 COL-10 c10data
         1 COL-11 c11data
         1 COL-12 c12data
         1 COL-13 c13data
         1 COL-14 c14data
         2 COL-1  c1dataX
         2 COL-2  c2dataX
         2 COL-3  c3dataX
         2 COL-4  c4dataX
         2 COL-5  c5dataX
         2 COL-6  c6dataX
         2 COL-7  c7dataX
         2 COL-8  c8dataX
         2 COL-9  c9dataX
         2 COL-10 c10dataX
         2 COL-11 c11dataX
         2 COL-12 c12dataX
         2 COL-13 c13dataX
         2 COL-14 c14dataX

28 rows selected.

SQL>

我得到了这个问题的答案。

https://dbfiddle.uk/?rdbms=oracle_18&fiddle=412a6e27a22741ee1c31eee4a3f2bf3