求一个oracle字符串解析函数

MIS_ECSM 2010-11-20 03:41:55
求一个oracle函数,具体要求如下:
输入参数1:varchar2,以分号分隔多个内容,如“11;22;3323;abc;ddd”
输入参数2:integer数值,返回值的位置

输出参数:varchar2;输出参数是输入参数1中,第《输入参数2》个用";"分隔的值;
例如:
输入参数('11;22;3323;abc;ddd',1),返回 11
输入参数('11;22;3323;abc;ddd',4),返回 abc

...全文
164 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
YY_MM_DD 2010-11-20
  • 打赏
  • 举报
回复


SQL> create or replace procedure checkStr(inputStr varchar2,appearCount in num
r,returnStr out varchar2)
2 as
3 begin
4 if appearCount=1 then
5 select substr(inputStr,0,instr(inputstr,';',1,1)-1) into ret
nStr from dual;
6 else
7 dbms_output.put_line(instr(inputStr,';',1,appearCount-1));
8 dbms_output.put_line(instr(inputStr,';',1,appearCount));
9 select substr(inputStr,instr(inputStr,';',1,appearCount-1)+1
nstr(inputStr,';',1,appearCount)-instr(inputStr,';',1,appearCount-1)-1) into r
urnStr from dual;
10 end if;
11 end;
12 /

过程已创建。

SQL> declare
2 rstr varchar2(20);
3 begin
4 checkStr('11;22;3323;abc;ddd',4,rstr);
5 dbms_output.put_line(rstr);
6 end;
7 /
11
15
abc

PL/SQL 过程已成功完成。

SQL> declare
2 rstr varchar2(20);
3 begin
4 checkStr('11;22;3323;abc;ddd',3,rstr);
5 dbms_output.put_line(rstr);
6 end;
7 /
6
11
3323

PL/SQL 过程已成功完成。

SQL>
tangren 2010-11-20
  • 打赏
  • 举报
回复
--通用一点,可指定分隔符
CREATE OR REPLACE FUNCTION getstr(str VARCHAR2, n PLS_INTEGER, delim CHAR) RETURN VARCHAR2 IS
tempstr VARCHAR2(2000);
--str :原始字符串
--n :取第几个字符串
--delim:分隔符
--调用方式: getstr('11;22;3323;abc;ddd',3,';')
BEGIN
tempstr := delim || str || delim;
RETURN substr(tempstr,
instr(tempstr, delim, 1, n) + 1,
instr(tempstr, delim, 1, n + 1) - instr(tempstr, delim, 1, n) - 1);
END;
/
心中的彩虹 2010-11-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wkc168 的回复:]
select substr(';'||id||';',instr(';'||id||';',';',1,i)+1,instr(';'||id||';',';',1,i+1)-instr(';'||id||';',';',1,i)-1) from tb
[/Quote]

SQL> edi
已写入 file afiedt.buf

1 create or replace function fun_zf(str varchar2,i number) return varchar2
2 as
3 id varchar2(100);
4 str2 varchar2(100);
5 begin
6 id:=';'||str||';';
7 select
8 substr(id,instr(id,';',1,i)+1,instr(id,';',1,i+1)-instr(id,';',1,i)-1) into str2
9 from dual;
10 return str2;
11* end;
SQL> /

函数已创建。

SQL> select fun_zf('11;22;3323;abc;ddd',1) from dual
2 /

FUN_ZF('11;22;3323;ABC;DDD',1)
--------------------------------------------------------------------------------
11

SQL> select fun_zf('11;22;3323;abc;ddd',4) from dual
2 /

FUN_ZF('11;22;3323;ABC;DDD',4)
--------------------------------------------------------------------------------
abc



YY_MM_DD 2010-11-20
  • 打赏
  • 举报
回复
------使用instr(startStr,appearstr,startposition,appearAount)封号出现的次数。
select substr(str,instr(str,';',1,i-1)+2,instr(str,';',1,i)-2) from dual
心中的彩虹 2010-11-20
  • 打赏
  • 举报
回复
select substr(';'||id||';',instr(';'||id||';',';',1,i)+1,instr(';'||id||';',';',1,i+1)-instr(';'||id||';',';',1,i)-1) from tb

17,078

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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