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;

 得到執行結果:

解析:

獲取到的表結果:

 

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