急!急!急!如何将字符串拆分后形成集合返回???

NoReady 2006-11-03 05:36:23
1、oracle10g中是否具有以下功能的函数:
将字符串:100,101,102
拆分后形成以下3条记录:
100
101
102


2、或者是否可以写个自定义函数将此字符串拆分,然后以集合返回?
...全文
428 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
NoReady 2006-11-08
  • 打赏
  • 举报
回复
2、声明类型如下:
-------------------------------------------
CREATE OR REPLACE TYPE NUMBER_SET IS TABLE OF NUMBER
NoReady 2006-11-08
  • 打赏
  • 举报
回复
解决方法如下:
1、声明一个Table类型
2、增加一个function解析字符串,以Table返回

具体如下:
----------------------------------------------------

CREATE OR REPLACE FUNCTION f_GetSubSpec

/*
============================================
版本:v1.0
名称:xx
作用:xxx
说明:
创建:xxx,2006-11-3
修改:xxx,2006-11-3
============================================
*/

(
varYearID IN NUMBER, -- 年度标识
varSpecID IN NUMBER -- 投资结构节点标识
)
RETURN NUMBER_SET DETERMINISTIC PIPELINED IS
varNodesString VARCHAR2(2000);
varNodeID VARCHAR2(100);
i INTEGER;
BEGIN
varNodesString := f_getsubspecstring(varYearID, varSpecID);

i := INSTR(varNodesString, ',');
WHILE i <> 0 LOOP
varNodeID := SUBSTR(varNodesString,1, i - 1);
PIPE ROW(varNodeID);
varNodesString := SUBSTR(varNodesString, i + 1);
i := INSTR(varNodesString, ',');
END LOOP;
IF varNodesString IS NOT NULL THEN
PIPE ROW(varNodeID);
END IF;

RETURN;
END;
NoReady 2006-11-08
  • 打赏
  • 举报
回复
to Eric_1999(╙@^@╜) ,因为我是在一句SQL调用,所以不能用SP。

目前现在问题已经解决,参考的是另一贴子。
Eric_1999 2006-11-03
  • 打赏
  • 举报
回复
FYI.

http://community.csdn.net/Expert/topic/5111/5111737.xml?temp=.5863459
Eric_1999 2006-11-03
  • 打赏
  • 举报
回复
这样可以吗?
SQL> create table tmp
2 (
3 name varchar2(40),
4 ny varchar2(10),
5 str varchar2(100)
6 )
7 /

Table created.

SQL> insert into tmp values ('aa', '200607', '6,7');

1 row created.

SQL> insert into tmp values ('bb', '200608', '4,5,6,7,8,9');

1 row created.

SQL> select * from tmp
2 /

NAME NY STR
---------------------------------------- ---------- ------------------------------------------------
aa 200607 6,7
bb 200608 4,5,6,7,8,9

SQL> create or replace procedure substring_array(name varchar2, ny varchar2, str in varchar2) as
2 type array_str is table of varchar2(100)
3 index by binary_integer;
4 myarray array_str;
5 v_str varchar2(4000) default str;
6 begin
7 for i in 0 .. length(str)-length(replace(str,',',''))+1 loop
8
9 if instr(v_str,',') = 0 then
10 myarray(i+1) := v_str ;
11 else
12 myarray(i+1) := substr(v_str,0,instr(v_str,',')-1);
13 end if;
14 v_str := substr(v_str,instr(v_str,',')+1);
15 end loop;
16
17 for i in 0 ..length(str)-length(replace(str,',','')) loop
18 dbms_output.put_line(name || ' ' || ny || ' ' || myarray(i+1));
19 end loop ;
20 end substring_array;
21 /

Procedure created.

SQL> declare
2 name varchar2(40);
3 ny varchar2(10);
4 str varchar2(100);
5 begin
6 for c1 in (select name,ny,str from tmp)
7 loop
8 substring_array(c1.name,c1.ny,c1.str);
9 end loop;
10 end;
11 /
aa 200607 6
aa 200607 7
bb 200608 4
bb 200608 5
bb 200608 6
bb 200608 7
bb 200608 8
bb 200608 9

PL/SQL procedure successfully completed.

SQL>
NinGoo 2006-11-03
  • 打赏
  • 举报
回复
如果格式是固定的xxx,xxx,xxx的话,直接substr+instr就可以了

SQL> create table test(a varchar2(30));

表已创建。

SQL> insert into test values('100,101,102');

已创建 1 行。

SQL> select substr(a,0,instr(a,',')-1),
2 substr(a,instr(a,',')+1,instr(substr(a,instr(a,',')+1),',')-1),
3 substr(a, instr(a,',',-1)+1)
4 from test;

SUBSTR(A,0,INSTR(A,',')-1)
------------------------------------------------------------
SUBSTR(A,INSTR(A,',')+1,INSTR(SUBSTR(A,INSTR(A,',')+1),',')-
------------------------------------------------------------
SUBSTR(A,INSTR(A,',',-1)+1)
------------------------------------------------------------
100
101
102

不然的话还是写函数吧
jdsnhan 2006-11-03
  • 打赏
  • 举报
回复
没有直接的功能,只能自己写了。
多壮志 2006-11-03
  • 打赏
  • 举报
回复
oracle不能做到sqlserver那样的。 ……+++++++++++++
NoReady 2006-11-03
  • 打赏
  • 举报
回复
xiaoxiao1984(笨猫儿),我需要的是一个函数。SP不考虑的
xiaoxiao1984 2006-11-03
  • 打赏
  • 举报
回复
可以写一个存储过程返回游标来实现

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧