oracle存储过程实例,根据value字段信息变更name字段信息

建表插入数据语句

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;

 得到执行结果:

解析:

获取到的表结果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章