一个简单的存储过程,在线等 表:aa bb 1 1,2 2 33 5,6,7我想显示为:aa bb 1 1 1 22 33 53 63 7 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 SQL> select * from t1; AA BB---------- ---------- 1 1,2 2 3 3 5,6,7SQL> select aa, substrb(','||bb, instrb(','||bb,',',1,rr)+1, instrb(','||bb||',',',',1,rr+1)-instrb(','||bb,',',1,rr)-1) 2 from t1,(select rownum rr from all_objects where rownum<1000) 3 where instrb(','||bb,',',1,rr)>0 4 order by aa,rr; AA SUBSTRB(','---------- ----------- 1 1 1 2 2 3 3 5 3 6 3 7已选择6行。 1楼的错了,SQL> select aa, 2 substrb( ', '||bb, instrb( ', '||bb, ', ',1,rr)+1, 3 instrb( ', '||bb|| ', ', ', ',1,rr+1)-instrb( ', '||bb, ', ',1,rr)-1) 4 from tt,(select rownum rr from all_objects where rownum <1000) 5 where instrb( ', '||bb, ', ',1,rr)> 0 6 order by aa,rr 7 / AA SUBSTRB(','||BB,INSTRB(','||BB---------- ------------------------------ 1 1,2 2 3 3 5,6,7结果正在进行中........... 用游标可以实现 给你一个例子,希望能给你帮助:使用PLSQL实现在一条记录中以特定分隔符隔离的数据进行字符串拆分。T_ALLDEV表中的字段ALLDODEV中内容为“AAA,BB,CCC,DD,E”,T_ROUTDEF表中与该表数据一一对应,需要使用SEQID字段的内容,将ALLDODEV内容进行字符串拆分后,分成多条记录,插入T_SepDev表中。具体代码见详细内容。 DECLARE CURSOR c_Tool IS --定义游标 SELECT T.PARTID, T.ALLDODEV, T.PRIDEV FROM T_AllDev T; rowCurTool c_Tool%rowtype; iSeqid number; vAllDev varchar2(255); --全标识字符串 vPriDev varchar2(255); --首选代码 iLength number; iTimes number; --包含的个数 iCur number; --当前是第几个 vCurDev varchar2(255); --当前 vIsFirst varchar2(1); --是否首选 iSubLength number; BEGIN OPEN c_Tool; FETCH c_Tool into rowCurTool; while c_Tool%found loop SELECT F.SEQID into iSeqid FROM T_ROUTDEF F WHERE F.PRTNO = rowCurTool.PARTID; vAllDev := rowCurTool.ALLDODEV; vPriDev := rowCurTool.PRIDEV; iLength := length(vAllDev); select length(vAllDev)-length(replace(vAllDev,’,’,null)) into iTimes from dual; --计算其中包含的个数 iTimes := iTimes+1; iCur := 1; iSubLength := 1; while iCur <= iTimes loop vCurDev := substr(vAllDev,1,instr(vAllDev,’,’,1,1)); if iCur = iTimes then iSubLength := 0; else iSubLength := length(vCurDev); end if; vAllDev := substr(vAllDev,iSubLength+1); if iCur = iTimes then vCurDev := vAllDev; else vCurDev := substr(vCurDev,1,length(vCurDev)-1); end if; IF vCurDev = vPriDev THEN vIsFirst := ’1’; ELSE vIsFirst := ’0’; END IF; INSERT INTO T_SepDev(SEQID, RESCODE, ISFIRST) VALUES(iSeqid, vCurDev, vIsFirst); iCur := iCur + 1; end loop; FETCH c_Tool into rowCurTool; end loop; CLOSE c_Tool; END; 这个在oracle存储过程中用什么实现? 简单的存储过程编译错误。why?? 高手们救命啊一个关于图像处理问题 请问ORACLE10G中AWR报告如何通过工具或脚本自动生成? 日志切换 什莫是事务? 数据怎样分页显示 使用JDBC如何解决Oracle数据库断连重连。 SQL关于group by的统计问题? 请教一个oracle的算法问题,关于取数据 oracle中创建一个生成两位数的流水号 hsqldb
---------- ----------
1 1,2
2 3
3 5,6,7SQL> select aa, substrb(','||bb, instrb(','||bb,',',1,rr)+1, instrb(','||bb||',',',',1,rr+1)-instrb(','||bb,',',1,rr)-1)
2 from t1,(select rownum rr from all_objects where rownum<1000)
3 where instrb(','||bb,',',1,rr)>0
4 order by aa,rr; AA SUBSTRB(','
---------- -----------
1 1
1 2
2 3
3 5
3 6
3 7已选择6行。
SQL> select aa,
2 substrb( ', '||bb, instrb( ', '||bb, ', ',1,rr)+1,
3 instrb( ', '||bb|| ', ', ', ',1,rr+1)-instrb( ', '||bb, ', ',1,rr)-1)
4 from tt,(select rownum rr from all_objects where rownum <1000)
5 where instrb( ', '||bb, ', ',1,rr)> 0
6 order by aa,rr
7 / AA SUBSTRB(','||BB,INSTRB(','||BB
---------- ------------------------------
1 1,2
2 3
3 5,6,7结果正在进行中...........
使用PLSQL实现在一条记录中以特定分隔符隔离的数据进行字符串拆分。T_ALLDEV表中的字段ALLDODEV中内容为“AAA,BB,CCC,DD,E”,T_ROUTDEF表中与该表数据一一对应,需要使用SEQID字段的内容,将ALLDODEV内容进行字符串拆分后,分成多条记录,插入T_SepDev表中。具体代码见详细内容。 DECLARE
CURSOR c_Tool IS --定义游标
SELECT T.PARTID,
T.ALLDODEV,
T.PRIDEV
FROM T_AllDev T;
rowCurTool c_Tool%rowtype;
iSeqid number;
vAllDev varchar2(255); --全标识字符串
vPriDev varchar2(255); --首选代码
iLength number;
iTimes number; --包含的个数
iCur number; --当前是第几个
vCurDev varchar2(255); --当前
vIsFirst varchar2(1); --是否首选
iSubLength number;
BEGIN
OPEN c_Tool;
FETCH c_Tool into rowCurTool;
while c_Tool%found loop
SELECT F.SEQID
into iSeqid
FROM T_ROUTDEF F
WHERE F.PRTNO = rowCurTool.PARTID;
vAllDev := rowCurTool.ALLDODEV;
vPriDev := rowCurTool.PRIDEV;
iLength := length(vAllDev);
select length(vAllDev)-length(replace(vAllDev,’,’,null)) into iTimes from dual; --计算其中包含的个数
iTimes := iTimes+1;
iCur := 1;
iSubLength := 1;
while iCur <= iTimes loop
vCurDev := substr(vAllDev,1,instr(vAllDev,’,’,1,1));
if iCur = iTimes then
iSubLength := 0;
else
iSubLength := length(vCurDev);
end if;
vAllDev := substr(vAllDev,iSubLength+1);
if iCur = iTimes then
vCurDev := vAllDev;
else
vCurDev := substr(vCurDev,1,length(vCurDev)-1);
end if;
IF vCurDev = vPriDev THEN
vIsFirst := ’1’;
ELSE
vIsFirst := ’0’;
END IF;
INSERT INTO T_SepDev(SEQID,
RESCODE,
ISFIRST)
VALUES(iSeqid,
vCurDev,
vIsFirst);
iCur := iCur + 1;
end loop;
FETCH c_Tool into rowCurTool;
end loop;
CLOSE c_Tool;
END;