我写了一个存储过程用于分割一个字符串,用'.'分开,希望得到每个子串的值,也就是'.'之间的内容.但是有问题.大家帮我看看哦.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;
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;
(
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;
名称: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;
UPDATE MS_COMPONENTCONF --把子串的设置为'1'
SET PROPVALUE = '1'
WHERE COMPONENTNAME = v_substr;
就不对了 哦?