oracle 存储过程中分割字符串

ainibaobao 2007-05-10 10:43:55
我写了一个存储过程用于分割一个字符串,用'.'分开,希望得到每个子串的值,也就是'.'之间的内容.但是有问题.大家帮我看看哦.

CREATE OR REPLACE PROCEDURE pro_componentmodify (p_string IN VARCHAR2,p_string_size IN NUMBER)
IS
p_start NUMBER := 1; --开始的指针,这个为依次增加的
p_find NUMBER := 1; --找到.的开始的字符位置
p_getnum NUMBER := 0; --需要获得的子串的长度
p_num NUMBER := p_string_size; --得到字符串的总长度
flag VARCHAR2 := '.'; --分割符
substring VARCHAR2; --用于存储的子串
BEGIN
UPDATE MS_COMPONENTCONF --先把所有的设置为'0'
SET PROPVALUE = '0'
WHILE(p_start <= p_num) LOOP --如果得到的字符不为'.'
IF ((SUBSTR(p_string,p_start,1) = flag) or (p_start = p_num))
THEN
substring := SUBSTR(p_string,p_find,p_getnum); --得到子串
UPDATE MS_COMPONENTCONF --先把子串的设置为'1'
SET PROPVALUE = '1'
WHERE COMPONENTNAME = substring;
p_find := p_start + 1;
END IF;
p_start := p_start + 1;
p_getnum := p_getnum + 1;
END LOOP;
END pro_componentmodify;
...全文
1659 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
heyixiang 2007-05-13
  • 打赏
  • 举报
回复
分号,目前可以明显得看到是这个原因
ainibaobao 2007-05-13
  • 打赏
  • 举报
回复
...呵呵.很无语哦,谢谢大家...的确是犯低级错误了...
precipitant 2007-05-13
  • 打赏
  • 举报
回复
按理说,这里不必 需要 immediate execute
precipitant 2007-05-12
  • 打赏
  • 举报
回复
不会是 没加 分号 这样的低级错误吧?
ainibaobao 2007-05-11
  • 打赏
  • 举报
回复
wangshi013(往事)的可以编译过,但是为什么我在你的对子串的处理的位置加上
UPDATE MS_COMPONENTCONF --把子串的设置为'1'
SET PROPVALUE = '1'
WHERE COMPONENTNAME = v_substr;
就不对了 哦?
ainibaobao 2007-05-11
  • 打赏
  • 举报
回复
上面这个是我重新写的一个....我是要从页面得到哪些checkbox被选中了,在javabean里面把各个被选中的checkbox的名称组装成一个字符串...例如: name1.name2.name3. 把这个字符串作为参数给存储过程,然后用存储过程把name1等分割出来...
ainibaobao 2007-05-11
  • 打赏
  • 举报
回复
编号:9
名称:pro_testcom
用途:尝试编写和8具有功能相同的存储过程
说明:和上面存储过程的参数相同,但是用到了更强大的函数INSTR函数
例子:email.msgserver.netfee. 该例子和上面的不一样
测试:未测试


--创建存储过程
CREATE OR REPLACE PROCEDURE pro_testcom (p_string IN VARCHAR2,p_string_size IN NUMBER)
IS
p_start NUMBER := 1; --开始的指针,这个为依次增加的
p_m_string VARCHAR2 := p_string; --用于存储母串的信息
sub_string VARCHAR2; --每次得到的子串
BEGING
UPDATE MS_COMPONENTCONF --先把所有的设置为'0'
SET PROPVALUE = '0'
WHILE(p_start < p_string_size) LOOP
IF (INSTR(p_m_string,'.',p_start) <> p_string_size)
THEN
sub_string := SUBSTR(p_m_string,p_start,INSTR(p_m_string,'.',p_start)-1); --得到子串
UPDATE MS_COMPONENTCONF --把子串的设置为'1'
SET PROPVALUE = '1'
WHERE COMPONENTNAME = substring;
p_start := INSTR(p_m_string,'.',p_start)+1;
END IF;
END LOOP;
END pro_testcom;
wangshi013 2007-05-11
  • 打赏
  • 举报
回复
用这个试试,看是不是你想要的

create procedure p_csdn_test2
(
i_string varchar2
)
as
v_substr varchar2(100); --子串长度根据程序需要修改
v_pos1 integer;
v_pos2 integer;
v_num integer;
begin
v_pos1 := 1;
v_num := 1;
while instr(i_string,'.',v_pos1+1) <> 0 loop
v_pos2 := instr(i_string,'.',v_pos1+1);
if v_num = 1 then
if instr(i_string,'.',v_pos1,v_num) = 1 then
v_substr := substr(i_string,v_pos1+1,v_pos2-1);
else
v_substr := substr(i_string,v_pos1,v_pos2-1);
end if;
else
v_substr := substr(i_string,v_pos1+1,v_pos2-v_pos1-1);
end if;
/*
clause --对子串的处理
*/
v_num := v_num + 1;
v_pos1 := v_pos2;
end loop;
v_substr := substr(i_string,v_pos1+1);
/*
clause --对子串的处理
*/
end;


ainibaobao 2007-05-11
  • 打赏
  • 举报
回复
没有人知道吗?
ainibaobao 2007-05-11
  • 打赏
  • 举报
回复
现在不是测试数据的问题哦...就是这个存储过程都编译不过的..
CathySun118 2007-05-11
  • 打赏
  • 举报
回复
给个测试数据,好看些
DragonBill 2007-05-11
  • 打赏
  • 举报
回复
UPDATE 用 immediate execute语句处理

17,086

社区成员

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

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