工作中的小问题,却困扰了我一天,到网上找了一些代码,都说是最好的,封装成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
如果你喜欢本文,请顶一下,支持我,你的支持是我继续发好文章的最大动力。谢谢。
好东西需要分享,快把本文发给你的朋友吧~!~