日期:2014-05-17  浏览次数:21242 次

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

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;

------解决方案--------------------
我的异常网推荐解决方案:oracle存储过程,http://www.aiyiweb.com/oracle-develop/177537.html
------解决方案--------------------
给个测试数据,好看些
------解决方案--------------------
用这个试试,看是不是你想要的

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