我正在做一个分配,目标是编写一个包含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只是在循环中停止。 (就像它正在执行无限循环一样,但不是)。
有人有什么想法吗?
答案 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;
/
您的所有三个示例均使用此代码。
鲍比