请教pl/sql高手(急)

darkangel199 2005-03-08 05:12:49
表中有一个字段col,它的类型是varchar2的,它存储的格式为“123.45@@111@@...”,现在的问题是能不能在存储过程中用PL/SQL实现如下功能:
取出col的值后以“@@”为分割符分割出123.45和111等,即实现java语言中String的split方法
...全文
96 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
darkangel199 2005-03-09
  • 打赏
  • 举报
回复
谢谢大家的回复,我自己已经解决,返回的是一个自定义的数组,代码如下:

CREATE TYPE m_array AS VARRAY(20) OF VARCHAR2(200);


CREATE OR REPLACE FUNCTION "M_SPLIT" (m_c VARCHAR2,s_c VARCHAR2)
RETURN m_array IS
--本函数实现了对字符串的split功能
--m_c,需要分割的字符串;s_c分割符
--定义变量
--type m_array is varray(20) of varchar2(200);--定义返回数组类型
v_m m_array := m_array('');--初始化数组
array_i number;--数组下标
t_c VARCHAR2(1000);
BEGIN
array_i := 1;
t_c := m_c;
while instr(t_c,s_c,1) > 0 Loop
if array_i > 1 then
v_m.extend;
end if;
t_c := trim(t_c);
--dbms_output.put_line(substr(m_c,0,instr(m_c,s_c,1)-1));
v_m(array_i) := substr(t_c,0,instr(t_c,s_c,1)-1);
t_c := substr(t_c,instr(t_c,s_c,1)+2);
--dbms_output.put_line(m_c);
array_i := array_i+1;
end Loop;
return v_m;
END M_SPLIT;
bzszp 2005-03-09
  • 打赏
  • 举报
回复
SQL> declare
2 v_str varchar2(50);
3 begin
4 v_str:='123@@12.45@@248';
5 while instr(v_str,'@@')>0 loop
6 dbms_output.put_line(substr(v_str,1,instr(v_str,'@@')-1));
7 v_str:=substr(v_str,instr(v_str,'@@')+2);
8 end loop;
9 dbms_output.put_line(v_str);
10 end;
11 /
123
12.45
248

PL/SQL 过程已成功完成。

SQL>
sanoul 2005-03-09
  • 打赏
  • 举报
回复
范式这个词好久没听说,hoho,像是恐龙时代来的
mingxuan3000 2005-03-08
  • 打赏
  • 举报
回复
学习
nebulaly 2005-03-08
  • 打赏
  • 举报
回复
表设计有问题,1范式都不满足,数据量大了之后查询怎么办?
huangyan168168 2005-03-08
  • 打赏
  • 举报
回复
写一个函数吧
sanoul 2005-03-08
  • 打赏
  • 举报
回复
标示符可以自己修改mytag参数,也可以像下面一样通过传入得到
++++++++++++++++++++++

create or replace function getcol(mystr char,mytag char,seg_no integer) return char is
Result char(100);
i integer;
rl integer;
mylen integer;
--mytag char(2);
mytemp char(100);--left string seg
begin
mytemp := MyStr;
--mytag := '@@';
mylen := length(trim(mytemp));
i := seg_no;

while (i > 0) loop

rl := instr(mytemp,mytag) - 1;

if rl = -1 then
result := mytemp;
exit;
end if;

result := substr(mytemp, 1, rl);
mytemp := substr(mytemp, rl + 3,mylen - rl);

I := I - 1;
end loop;

return(Result);
end getcol;
sanoul 2005-03-08
  • 打赏
  • 举报
回复
忘说了,返回字段大小可以自定义,范围(1-32767)
icewolf_li 2005-03-08
  • 打赏
  • 举报
回复
分割出来你要以什么形式返回?
sanoul 2005-03-08
  • 打赏
  • 举报
回复
函数如下:
-------------------
create or replace function getcol(mystr char,seg_no integer) return char is
Result char(100);
i integer;
rl integer;
mylen integer;
mytag char(2);
mytemp char(100);--left string seg
begin
mytemp := MyStr;
mytag := '@@';
mylen := length(trim(mytemp));
i := seg_no;

while (i > 0) loop

rl := instr(mytemp,mytag) - 1;

if rl = -1 then
result := mytemp;
exit;
end if;

result := substr(mytemp, 1, rl);
mytemp := substr(mytemp, rl + 3,mylen - rl);

I := I - 1;
end loop;

return(Result);
end getcol;

===============
下班也……
sanoul 2005-03-08
  • 打赏
  • 举报
回复
SQL> create or replace function getcol(mystr char,seg_no integer) return char is
2 Result char(100);
3 i integer;
4 rl integer;
5 mylen integer;
6 mytag char(2);
7 mytemp char(100);--left string seg
8 begin
9 mytemp := MyStr;
10 mytag := '@@';
11 mylen := length(trim(mytemp));
12 i := seg_no;
13
14 while (i > 0) loop
15
16 rl := instr(mytemp,mytag) - 1;
17
18 if rl = -1 then
19 result := mytemp;
20 exit;
21 end if;
22
23 result := substr(mytemp, 1, rl);
24 mytemp := substr(mytemp, rl + 3,mylen - rl);
25
26 I := I - 1;
27 end loop;
28
29 return(Result);
30 end getcol;
31 /

函数已创建。

SQL> select getcol('WW@@3467.213@@KDI99@SINA.COM',2) 第二段字符 from dual;

第二段字符
--------------------------------------------------------------------------------
3467.213



SQL> select getcol('WW@@3467.213@@KDI99@SINA.COM',3) no3 from dual;

NO3
--------------------------------------------------------------------------------
KDI99@SINA.COM



SQL> select getcol('WW@@3467.213@@KDI99@SINA.COM',1) no3 from dual;

NO3
--------------------------------------------------------------------------------
WW


SQL> select getcol('WW@@3467.213@@KDI99@SINA.COM',0) no0 from dual;

NO0
--------------------------------------------------------------------------------

dinya2003 2005-03-08
  • 打赏
  • 举报
回复
可以的,要写个函数.

17,086

社区成员

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

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