Как убрать лишний символ в конце строки в pl sql с помощью регулярных выражений - PullRequest
0 голосов
/ 15 января 2020

Когда я запускаю это, данные v_hold равны "AAA", что является длиной моего поля SQL, однако длина (v_hold) равна 4. Я знаю, что могу использовать substr () для получения необходимой длины. trim () тоже не справляется. Почему длина на один больше, чем должна быть? Есть ли решение, связанное с повторным вызовом функции, если правильно указать «все, что находится после последней запятой, ТОЛЬКО alphanumeri c». Как всегда, спасибо за вклад.

    loop
     UTL_FILE.GET_LINE(utl_fh_r, v_input_string);
     dbms_output.put_line(v_input_string);

     v_emplid   := REGEXP_SUBSTR(v_input_string, '[^,]+', 1, 1);
     n_empl_rcd := REGEXP_SUBSTR(v_input_string, '[^,]+', 1, 2);
     n_goal_amt := REGEXP_SUBSTR(v_input_string, '[^,]+', 1, 3);
     v_dedcd    := REGEXP_SUBSTR(v_input_string, '[^,]+', 1, 4);
     v_hold := REGEXP_SUBSTR(v_input_string, '[^,\\r\\n]*.$'); 


     dbms_output.put_line(v_emplid || ' : ' || n_empl_rcd || ' : ' || n_goal_amt || ' : ' || 
                          v_dedcd || ' : ' || v_hold || 'len ' || length(v_hold));
    end loop;

 exception
  when UTL_FILE.READ_ERROR then
   UTL_FILE.FCLOSE(utl_fh_r);
   --dbms_output.put_line('UTL_FILE read error after line ' || n_lines_read || ' ' || V_IN_FILE);

  when NO_DATA_FOUND then
   dbms_output.put_line('NO DATA');
    end;

1 Ответ

0 голосов
/ 16 января 2020

Регулярное выражение неправильно в строке, которая устанавливает v_hold. Это должно заканчиваться .*$. У вас есть *.

В других новостях, пожалуйста, измените формат REGEXP_SUBSTR на этот, так как ваша форма не обрабатывает NULL-элемент. Смотрите здесь для получения дополнительной информации: { ссылка }

REGEXP_SUBSTR(v_input_string, '(.*?)(,|$)', 1, 1, NULL, 1);
REGEXP_SUBSTR(v_input_string, '(.*?)(,|$)', 1, 2, NULL, 1);
etc...
...