我有一张表a的记录如下(DEPART_ID是varchar2型):
DEPART_ID Num
----------- -------
;88;10; 3
;A_1;88;4; 1
;A_2;4;89; 5
... ... ...
能否通过view,procedure,type或其他的方法从表a得到下面的这些数据形式(根据DEPART_ID中的;来拆分):
DEPART_ID Num
----------- -------
88 3
10 3
A_1 1
88 1
4 1
A_2 5
4 5
89 5
... ... ...
该如何实现比较好?不管用什么方法都行啊!
DEPART_ID Num
----------- -------
;88;10; 3
;A_1;88;4; 1
;A_2;4;89; 5
... ... ...
能否通过view,procedure,type或其他的方法从表a得到下面的这些数据形式(根据DEPART_ID中的;来拆分):
DEPART_ID Num
----------- -------
88 3
10 3
A_1 1
88 1
4 1
A_2 5
4 5
89 5
... ... ...
该如何实现比较好?不管用什么方法都行啊!
解决方案 »
- HP unix系统装了oracle10G,报错版本的8.1.7
- oracel中两个timestamp差值的问题?
- Pro*c 编译问题:PCC-F-02390, 未遇到任何 EXEC SQL CONTEXT USE 语句
- 创建主键自增长的触发器出错!!!
- Oracle中的XML模板注册
- 谈谈TOPLINK的未来?
- 请教一个有关JSP的多条件复合查询
- 大家谁能告诉我,oracle9idba认证都考那四科呀。必须有一科要参加培训吗
- 如何一下子关闭多个游标?游标数量不定。
- 为什么建表报‘ERROR 位于第 1 行:ORA-00922: 缺少或无效选项’
- 关于临时表空间和回滚段的问题
- 救命呀!数据库瘫痪了!!请问原因是???
用instr加上substr函数就可以拆分了
你好,能具体点吗?
对于每一行数据进行处理
instr(str,';',1) 返回 字符串中';'第一次出现的位置
substr(str,2,3) 从第二位开始截取str后面的三个字符
/create or replace function strtab(p_str in varchar2)
return mytabletype
as
lstr varchar2(1000) default p_str||',';
ln number;
ldata mytabletype:=mytabletype();
begin
loop
ln:=instr(lstr,',');
exit when (nvl(ln,0)=0);
ldata.extend;
ldata(ldata.count):=ltrim(rtrim(substr(lstr,1,ln-1)));
lstr:=substr(lstr,ln+1);
end loop;
return ldata;
end;
/SQL> select * from table(cast(strtab('11,12,13') as mytabletype));COLUMN_VALUE
------------
11
12
13SQL> create table bb(id varchar2(2),name varchar2(10));Table createdSQL> insert into bb values('11','张三');1 row insertedSQL> insert into bb values('12','李四');1 row insertedSQL> insert into bb values('13','王五');1 row insertedSQL> select * from bb where id in (select * from table(cast(strtab('11,12,13') as mytabletype)));ID NAME
-- ----------
11 张三
12 李四
13 王五