建表插入數據語句
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;
得到執行結果:
解析:
獲取到的表結果: