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
我有一个 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