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

解决方案 »

  1.   

    用这个试试,看是不是你想要的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;
      

  2.   

    编号: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;
      

  3.   

    上面这个是我重新写的一个....我是要从页面得到哪些checkbox被选中了,在javabean里面把各个被选中的checkbox的名称组装成一个字符串...例如:   name1.name2.name3.   把这个字符串作为参数给存储过程,然后用存储过程把name1等分割出来...
      

  4.   

    wangshi013(往事)的可以编译过,但是为什么我在你的对子串的处理的位置加上      
          UPDATE MS_COMPONENTCONF           --把子串的设置为'1'
          SET PROPVALUE = '1'          
          WHERE COMPONENTNAME = v_substr;
    就不对了 哦?
      

  5.   

    UPDATE 用 immediate execute语句处理
      

  6.   

    按理说,这里不必 需要   immediate execute