12
返回列表 发新帖
楼主: dgstonehuang

Oracle PL/SQL里,如何實現這個?

[复制链接]
论坛徽章:
0
11#
发表于 2007-4-21 11:11 | 只看该作者

我自己写了个函数,

第一个参数是源字符串,第二个参数是分隔符, 第三个参数是取第几个列.
FUNCTION get_deli_str_col(ps_str in varchar2, ps_del in varchar2, pn_col_num in number) return varchar2
is
        vs_str varchar2(32000) ;
        vs_ret_val varchar2(32000) ;
        i number  := pn_col_num ;
  vn_deli_len number(20) := lengthb(ps_del)  ;
begin
        vs_str := ps_str ;
        if substr(vs_str,-vn_deli_len,vn_deli_len) <> ps_del  then
                vs_str := vs_str ||ps_del  ;
        end if;
        if i = 1 then
                vs_ret_val := substr(vs_str, 1, instr(vs_str,ps_del ,1,1)-1 );
        else
                vs_ret_val := substr(vs_str, instr(vs_str,ps_del ,1,i-1)+ vn_deli_len, instr(vs_str,ps_del ,1,i) - instr(vs_str,ps_del,1,i-1)-vn_deli_len) ;                       
        end if ;
        vs_ret_val := rtrim(vs_ret_val,chr(10));
        vs_ret_val := rtrim(vs_ret_val,chr(13));
        vs_ret_val := trim(vs_ret_val);
        return vs_ret_val;
END get_deli_str_col ;

使用道具 举报

回复
论坛徽章:
1
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
12#
发表于 2007-4-23 11:35 | 只看该作者
最初由 kenni 发布
[B]可以考虑自己写一个涵数.

for 循环...应该不难..

我想ORACLE 应该自带这种函数吧...查查看. [/B]


不错的建议 看看这个是否可以,没有check的代码,自己调试一下
看是否可以

CREATE OR REPLACE PROCEDURE Get_Expect_Str( p_str IN VARCHAR2,
                          p_str_1 OUT NOCOPY VARCHAR2,
                          p_str_2 OUT NOCOPY VARCHAR2,
                                                  p_str_3 OUT NOCOPY VARCHAR2,
                                                  p_str_4 OUT NOCOPY VARCHAR2
                                                  )
IS
lv_str VARCHAR2(200) ;
BEGIN
lv_str := p_str ;
p_str_1:=SUBSTR('ABCDE|EERROOOPPJH1|IOIO6787765|JJTYY',1,INSTR('ABCDE|EERROOOPPJH1|IOIO6787765|JJTYY','|')-1);
p_str_2:=SUBSTR('ABCDE|EERROOOPPJH1|IOIO6787765|JJTYY',LENGTH(p_str_1)+1,INSTR('ABCDE|EERROOOPPJH1|IOIO6787765|JJTYY','|',LENGTH(p_str_1)+1)-LENGTH(p_str_1)-1);
p_str_3:=SUBSTR('ABCDE|EERROOOPPJH1|IOIO6787765|JJTYY',LENGTH(p_str_1||p_str_2)+1,INSTR('ABCDE|EERROOOPPJH1|IOIO6787765|JJTYY','|',LENGTH(p_str_1||P_str_2)+1)-LENGTH(p_str_1||p_str_2)-1);
p_str_4:=SUBSTR('ABCDE|EERROOOPPJH1|IOIO6787765|JJTYY',LENGTH(p_str_1||p_str_2||p_str_3),INSTR('ABCDE|EERROOOPPJH1|IOIO6787765|JJTYY','|',-1));
p_str_1:=trim(p_str_1);
p_str_2:=trim(p_str_2);
p_str_3:=trim(p_str_3);
p_str_4:=trim(p_str_4);
END Get_Expect_Str;
/

使用道具 举报

回复
论坛徽章:
1
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
13#
发表于 2007-4-23 11:44 | 只看该作者
精简一下:
CREATE OR REPLACE PROCEDURE Get_Expect_Str( p_str IN VARCHAR2,
                          p_str_1 OUT NOCOPY VARCHAR2,
                          p_str_2 OUT NOCOPY VARCHAR2,
                                                  p_str_3 OUT NOCOPY VARCHAR2,
                                                  p_str_4 OUT NOCOPY VARCHAR2
                                                  )
IS
lv_str VARCHAR2(200) ;
BEGIN
lv_str := p_str ;
p_str_1:=SUBSTR(lv_str,1,INSTR(lv_str,'|')-1);
p_str_2:=SUBSTR(lv_str,LENGTH(p_str_1)+1,INSTR(lv_str,'|',LENGTH(p_str_1)+1)-LENGTH(p_str_1)-1);
p_str_3:=SUBSTR(lv_str,LENGTH(p_str_1||p_str_2)+1,INSTR(lv_str,'|',LENGTH(p_str_1||P_str_2)+1)-LENGTH(p_str_1||p_str_2)-1);
p_str_4:=SUBSTR(lv_str,LENGTH(p_str_1||p_str_2||p_str_3),INSTR(lv_str,'|',-1));
p_str_1:=trim(p_str_1);
p_str_2:=trim(p_str_2);
p_str_3:=trim(p_str_3);
p_str_4:=trim(p_str_4);
END Get_Expect_Str;

使用道具 举报

回复
论坛徽章:
6
生肖徽章:羊
日期:2007-09-26 17:02:14ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:狗
日期:2008-10-14 10:47:19生肖徽章2007版:牛
日期:2008-10-24 11:04:53生肖徽章2007版:兔
日期:2009-11-16 18:40:362010新春纪念徽章
日期:2010-03-01 11:20:51
14#
发表于 2007-4-23 13:28 | 只看该作者
有那么复杂吗?

Java就好多了,直接一个split方法就可以了.

PL/SQL里写一个function就可以了.

以上几位就写的很好,我在这里就不重复了

使用道具 举报

回复
招聘 : 软件工程师
论坛徽章:
3
会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442011新春纪念徽章
日期:2011-02-18 11:43:35
15#
 楼主| 发表于 2007-4-23 13:39 | 只看该作者
谢谢大家,谢谢!!!

使用道具 举报

回复
论坛徽章:
5
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44奔驰
日期:2013-10-25 17:29:33
16#
发表于 2007-4-24 10:47 | 只看该作者
1 。定義一個Type:

create or replace type ZZZZ_R_Char_test as table of varchar2(2000);           --table of varchar;

2。定義一個Function

create or replace function strtab_test(p_str in varchar2)
return ZZZZ_R_Char_Test
as
lstr varchar2(1000) default p_str||'|';
ln number;
ldata ZZZZ_R_Char_test:=ZZZZ_R_Char_test();
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;


然後查詢︰
select column_value aa ,rownum rn from table(cast(strtab_test('W.W.E |PART NO:AL2006 *C/N: |G.W.: |P/O: |1234 *2564') as ZZZZ_R_Char_test))

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表