PL / SQL удаляет символы во время цикла - PullRequest
0 голосов
/ 11 октября 2018

Я работаю над заданием, целью которого является написание процедуры, которая имеет 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 просто останавливается в цикле.(Как будто это делает бесконечный цикл, но это не так).

У кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 11 октября 2018

Я думаю, вам нужно заменить p_text на v_temp во втором вызове substr.Таким образом, каждый раз, когда вы проходите цикл, вы работаете с обновленным 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;
/

Все три примера работают сэтот код.

Бобби

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...