PL / SQL在循环时删除字符

时间:2018-10-10 21:56:12

标签: plsql while-loop

我正在做一个分配,目标是编写一个包含2个输入字符串和一个char并从字符串中删除char的过程。

示例:RemoveAll(123-456-789,'-')将输出:123456789。

create or replace procedure MyRemoveAll 
        (p_text varchar2, p_char_1 char) as
        v_temp varchar2(100);

   BEGIN

    v_temp := p_text;

    WHILE instr(v_temp, p_char_1) != 0 LOOP
        v_temp := substr(v_temp, 1, instr(v_temp, p_char_1)-1)
            || substr(p_text, instr(v_temp, p_char_1)+1);
        END LOOP;   

    dbms_output.put_line (v_temp);

    END;
   /


   exec MyRemoveAll('123456789', '*');
   exec MyRemoveAll('123-456789', '-');
   exec MyRemoveAll('123*456*789', '*');  

在创建过程时,我没有收到任何错误,并且前两个执行可以正常工作。我试过只是运行: dbms_output.put_line(instr(123 * 456 * 789,*));

哪个给了我4的输出,所以它应该注册while循环的条件,但是SQL Plus只是在循环中停止。 (就像它正在执行无限循环一样,但不是)。

有人有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我认为您需要在第二个substr调用中用v_temp替换p_text。这样,每次循环浏览时,您都将使用更新的v_temp而不是原始的p_text。

这是它的样子:

create or replace procedure MyRemoveAll 
        (p_text varchar2, p_char_1 char) as
        v_temp varchar2(100);

BEGIN

 v_temp := p_text;

 WHILE instr(v_temp, p_char_1) != 0 LOOP

     v_temp := substr(v_temp, 1, instr(v_temp, p_char_1)-1)
         || substr(v_temp, instr(v_temp, p_char_1)+1);
END LOOP;   

 dbms_output.put_line (v_temp);

 END;
/

您的所有三个示例均使用此代码。

鲍比