【问题标题】:PL/SQL Remove Characters While LoopPL/SQL 在循环中删除字符
【发布时间】:2018-10-11 07:06:50
【问题描述】:

我正在处理一项任务,目标是编写一个具有 2 个输入的过程,一个字符串和一个字符,然后从字符串中删除字符。

示例: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 只是在循环处停止。 (就像它在做一个无限循环,但事实并非如此)。

有人有什么想法吗?

【问题讨论】:

  • 看来MyRemoveAll 只会实现replace()
  • 一个字符串和一个字符 - char 只是一种特殊的字符串,它添加空格以将值填充到其最大长度。这几乎没有什么好的用途,实际上它导致的问题多于它解决的问题,因此建议永远不要使用它。

标签: plsql while-loop


【解决方案1】:

我认为您需要在第二次 substr 调用中将 p_text 替换为 v_temp 。这样每次循环时,您都在使用更新后的 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;
/

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

鲍比

【讨论】:

  • 嘎。我现在看到了。这就是我从以前的作业中复制+粘贴代码所得到的。谢谢!
  • 嗨,你能看看我的问题吗?它类似于修剪最后一个字符。谢谢stackoverflow.com/questions/69834411/…
猜你喜欢
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 2013-07-21
  • 2023-04-01
相关资源
最近更新 更多