« 选国家测你好色指数(图)« »出差三周多了,感觉在移动公司办公太吵太累工作时间太短 »
oracle相当于split功能的代码(原创)

工作中的小问题,却困扰了我一天,到网上找了一些代码,都说是最好的,封装成oracle的函数,试过两个评价最高的(也转载到了我的"编程仓库"里了,请看: http://www.busfly.cn/CSDN/post/313.html ,和http://www.busfly.cn/CSDN/post/oracle-split02.html)

这两个东西各有特点,我只是成功的使用了第二个,第二个用到了管道,将split后的结果通过SQL查询语句来获取,结果,成功了,果然可以得到拆分后的结果集,不过我是在存储过程里用这个功能,想了半天的办法,都没法从这个没有列名的SQL查询结果集里一一循环取出每个拆分后的数据,痛苦啊,数据库没学好啊.嘿嘿.

没办法,最后,只好自己动手,从上面两人上函数里学习一下,直接取出一些代码出来直接用,不做函数了.结果成功,整个存储过程的代码如下,其中红色部分是拆分功能的代码,仔细看哦~~(里面还有一些不错的可能常用的东东哦,注意其它有颜色的代码)


create or replace procedure addReports as
  aID varchar2(10);
  aunitDept varchar2(200); --子公司ID
  nWday     number; --/*当前周第几天*/
  nMday     number; /*当前月第几天*/
  nYday     number; /*当前年第几天*/

  l_idx  number;
  l_list varchar2(32767);
  p_del  varchar2(4) := ',';

begin

  select TO_CHAR(SYSDATE - 1, 'D') into nWday from DUAL;
  select TO_CHAR(SYSDATE, 'DD') into nMday from DUAL;
  select TO_CHAR(SYSDATE, 'DDD') into nYday from DUAL;

  for rs in (select id URid, unitdept, roundtime, warnlastday, warnmsg
               from upReportSet) loop
 
    if rs.roundtime = 'week' and nWday = 1 then
      --awarnLastDay下面这个查询就是返回每周短信提醒时间
      SELECT TO_CHAR(next_day(SYSDATE, 7 - rs.warnlastday), 'yyyy-mm-dd')
        into awarnLastDay
        FROM dual;
      l_list := rs.unitdept || ',';
      loop
        l_idx := instr(l_list, p_del);
        if l_idx > 0 then
          aunitDept := substr(l_list, 1, l_idx - 1);
          if aunitDept is not null then
            --if aunitDept!='' then
            select SEQ_allReports.nextval into aID from dual;
            insert into allReports
              (ID, unitDept, URid, warnLastDay, warnmsg, isOver)
            values
              (aID, aunitDept, rs.URid, awarnlastday, rs.warnmsg, '0');
            -- end if;
          end if;

          l_list := substr(l_list, l_idx + length(p_del));
        else
          exit;
        end if;
      end loop;
    end if;  
 
    commit;  
  end loop;
end;

--以下是添加定时器
begin
  sys.dbms_job.submit(job => :job,
                      what => 'addReports;',
                      next_date => to_date('30-11-2007 08:30:00', 'dd-mm-yyyy hh24:mi:ss'),
                      interval => 'sysdate+1');
  commit;
end;

红色的代码不多吧,嘿嘿,其实也不像我想像的那么困难嘛,中间两段红色之间有背景的代码就是处理拆分出来的内容的功能

 


Tags: oracle数据库   |

原创文章如转载,请注明:转载自:巴士飞扬-技术BLOG : http://www.busfly.net/

本文链接地址:http://www.busfly.net/post/oracle-split.html

如果你喜欢本文,请顶一下,支持我,你的支持是我继续发好文章的最大动力。谢谢。
好东西需要分享,快把本文发给你的朋友吧~!~

     
相关文章:




◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
网站分类
分类最近文章
最近发表
最新评论及回复
最近留言
热文排行
随机推荐文章
Powered By Z-Blog   STYLE by busfly . FatMouse
Copyright © 2007 巴士飞扬技术博客. . 沪ICP备07027972号. 会员群1(J2EE为主):3769186.