zwjatjx 2012-03-03 10:31
浏览 279
已采纳

关于一张表中一条记录某个字段进行分割处理后插入到另一张表中多条数据的存储过程写法

     有两张表,表A为原始数据表,表B为结果表。表A结构如下所示,id为主键

   

id      result
1 a*b;c*d;e*f
2 g*h;i*j
3 k*l
4

表B结构如下所示,id和seq为联合主键

id seq num size
1        1 a b
1 2 c d
1 3 e f
2 1 g h
2 2 i j
3 1 k l

 

现在要对表A的数据进行处理,把A表result字段的数据按";"分割成好几条数据后再按"*"分割插入到B表中,结果如B表所示,这个用存储过程怎么实现啊,小弟想了很久想不出,各位有啥好的方法推荐下,拜托了

 

  • 写回答

4条回答 默认 最新

  • ll89308839 2012-03-06 12:50
    关注

    我用的oracle的给你写出来,哎,没写过存储过程的孩子伤不起啊,真心麻烦,还是java好使,能多给点分就多给点吧。。

    [code="sql"]
    declare
    sub_str varchar2(4000);
    insert_str varchar2(4000);
    seq int := 0;
    pos1 int := 1;
    pos2 int := 1;
    cursor c is
    select * from a;
    r c%rowtype;
    begin
    open c;
    --using loop to get the searching result
    loop
    fetch c
    into r;
    exit when c%notfound;
    --init pos1,pos2
    pos1 := 1;
    pos2 := 1;
    seq := 0;
    while pos2 != 0 and pos1 <= length(r.result) loop
    pos2 := instr(r.result, ';', pos1);
    seq := seq + 1;
    --judge the pos2 ,if equals zero means that the searching get end
    if pos2 != 0 then
    sub_str := substr(r.result, pos1, pos2 - pos1);
    else
    sub_str := substr(r.result, pos1);
    end if;
    --e.g. insert into B (id,seq,num,space) values (1,1,'a','b')
    insert_str := 'insert into B (id,seq,num,space) values ('
    || r.id || ',' || seq || ',' ||chr(39)||
    substr(sub_str, 1, instr(sub_str, '*')-1) ||chr(39)|| ','||chr(39) ||
    substr(sub_str, instr(sub_str, '*') + 1) ||chr(39)|| ')' ;
    --dbms_output.put_line(insert_str);
    execute immediate insert_str;
    -- next search position add 1
    pos1 := pos2 + 1;
    end loop;
    end loop;

    close c;
    commit;
    end;
    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器