建表插入数据语句
CREATE TABLE demo
(
id varchar2(32),
name varchar2(100),
value varchar2(100)
);
INSERT INTO "NEW_TEMP"."DEMO" ("ID", "NAME", "VALUE") VALUES ('1', '', 'c,d,a,b,a');
INSERT INTO "NEW_TEMP"."DEMO" ("ID", "NAME", "VALUE") VALUES ('2', '', 'a,b,c,d');
INSERT INTO "NEW_TEMP"."DEMO" ("ID", "NAME", "VALUE") VALUES ('3', '', 'b,a,b,c,d');
得到表:
题目:已知 1-a,2-b,3-c,4-d; 根据value中的字段填入name字段
解析:
因为value中的字段由abc...构成,而且“ 1-a,2-b,3-c,4-d”;并且使用“,”分割,
可以将value中的字段通过“,”分割为数组,得到类似[a,b,c,d]的数组,然后将其一一对应,再使用“,”拼接。并将得到的数据使用update语句赋值在name中。完成!
1.第一步,获取value字段列表z
create or replace procedure valueToName as
--声明变量(变量名 变量类型)
type v_type is record (
t_id varchar2(100),
t_value varchar2(100)
);
TYPE T_TYPE IS TABLE OF v_type;
d_value T_TYPE;
begin
select id, value bulk collect into d_value from DEMO;
for i in 1.. d_value.COUNT loop
DBMS_OUTPUT.PUT_LINE(d_value(i).t_id || '----' || d_value(i).t_value);
end loop;
end valueToName;
执行存储过程:
begin
valueToName();
end;
得到执行结果:
解析:
2.第二步,将获取到的value字段通过“,”分割,得到类似[a,b,c,d]数组
create or replace procedure valueToName as
--声明变量(变量名 变量类型)
type v_type is record (
t_id varchar2(100),
t_value varchar2(100)
);
TYPE T_TYPE IS TABLE OF v_type;
d_value T_TYPE;
d_value_group T_TYPE;
begin
select id, value bulk collect into d_value from DEMO;
for i in 1.. d_value.COUNT loop
-- DBMS_OUTPUT.PUT_LINE(d_value(i).t_id || '----' || d_value(i).t_value);
select null, STR bulk collect into d_value_group
from (SELECT REGEXP_SUBSTR(d_value(i).t_value, '[^,]+', 1, LEVEL, 'i') AS STR
FROM DUAL
CONNECT BY LEVEL <= LENGTH(d_value(i).t_value) - LENGTH(REGEXP_REPLACE(d_value(i).t_value, ',', '')) + 1);
for j in 1 .. d_value_group.COUNT loop
DBMS_OUTPUT.PUT_LINE( d_value(i).t_id || '---' || d_value_group(j).t_value);
end loop;
end loop;
end valueToName;
执行存储过程:
begin
valueToName();
end;
得到执行结果:
解析:
regexp_substr详情链接:https://blog.csdn.net/hyc123123123123/article/details/98731830
3.第三步,将d_value_group 字段中的数据通过1-a,2-b,3-c...一一对应,并将其通过“,”拼接,在赋值给name字段
create or replace procedure valueToName as
--声明变量(变量名 变量类型)
type v_type is record (
t_id varchar2(100),
t_value varchar2(100)
);
TYPE T_TYPE IS TABLE OF v_type;
d_value T_TYPE;
d_value_group T_TYPE;
d_name_str varchar2(100);
begin
select id, value bulk collect into d_value from DEMO;
for i in 1.. d_value.COUNT loop
-- DBMS_OUTPUT.PUT_LINE(d_value(i).t_id || '----' || d_value(i).t_value);
d_name_str := '';
select null, STR bulk collect into d_value_group
from (SELECT REGEXP_SUBSTR(d_value(i).t_value, '[^,]+', 1, LEVEL, 'i') AS STR
FROM DUAL
CONNECT BY LEVEL <= LENGTH(d_value(i).t_value) - LENGTH(REGEXP_REPLACE(d_value(i).t_value, ',', '')) + 1);
for j in 1 .. d_value_group.COUNT loop
-- DBMS_OUTPUT.PUT_LINE( d_value(i).t_id || '---' || d_value_group(j).t_value);
if d_value_group(j).t_value = 'a' then d_value_group(j).t_value := '1';
elsif d_value_group(j).t_value = 'b' then d_value_group(j).t_value := '2';
elsif d_value_group(j).t_value = 'c' then d_value_group(j).t_value := '3';
elsif d_value_group(j).t_value = 'd' then d_value_group(j).t_value := '4';
end if;
d_name_str := d_name_str || ',' || d_value_group(j).t_value;
end loop;
d_name_str := substr(d_name_str, 2, length(d_name_str));
DBMS_OUTPUT.PUT_LINE(d_name_str);
update demo set name = d_name_str where id = d_value(i).t_id;
end loop;
end valueToName;
执行存储过程:
begin
valueToName();
end;
得到执行结果:
解析:
获取到的表结果: