Форматирование строки в Oracle SQL - PullRequest
1 голос
/ 13 июля 2020

Я пытаюсь взять varchar2, который является входом процедуры, и отформатировать его, а затем выполнить некоторые вычисления с новой строкой. На входе будет последовательность имен, разделенных запятыми:

Пример: имя, идентификатор, адрес

Мне нужно найти способ изменить приведенное выше на :

CAST(name AS VARCHAR2(200)) name, 
CAST(id AS VARCHAR2(200)) id, 
CAST(address AS VARCHAR2(200)) address

Я пробовал посмотреть REGEXP_REPLACE, но я новичок, поэтому не знаю, как правильно использовать регулярное выражение.

(это для Oracle SQL кстати)

Ответы [ 3 ]

1 голос
/ 14 июля 2020

Похоже, это должно сработать для вас:

create or replace procedure p_test(params in varchar2) as 
   -- type for string array (collection/nested table)
   type t_str_array is table of varchar2(100);
   -- string array
   str_array t_str_array:=t_str_array();
   -- variable for a count of elements in comma-separated list
   cnt int;
   
   name    varchar2(100);
   id      varchar2(100);
   address varchar2(100);
begin
   -- count of elements in comma-separated list:
   cnt := regexp_count(params,'[^,]+');
   -- extending string collection up to CNT elements:
   str_array.extend(cnt);
   -- iterate and fill array:
   for i in 1..cnt loop
      str_array(i):=regexp_substr(params,'[^,]+',1,i);
   end loop;
   
   -- now we can set required variables to the values from array by their positions:
   name   :=str_array(1);
   id     :=str_array(2);
   address:=str_array(3);
   
   -- print them to check anddebug:
   dbms_output.put_line(utl_lms.format_message('name = %s, id = %s, addr = %s', name, id, address));
end;
/

И тестирование:

SQL> call p_test('Pups,1,Interstate 60');
name = Pups, id = 1, addr = Interstate 60

Call completed.
0 голосов
/ 13 июля 2020

Я просто пишу оператор select с выражениями, состоящими из substr и instr. Вы можете использовать те же выражения в своей процедуре, чтобы получить требуемый результат. Я предположил, что example_string содержит значения, разделенные запятыми: name, id, address.

SELECT SUBSTR(example_string,1,INSTR(example_String,',',1,1)-1) AS name, SUBSTR(example_string,INSTR(example_String,',',1,1)+1,INSTR(example_String,',',1,2)-INSTR(example_String,',',1,1)-1) AS id, SUBSTR(example_string,INSTR(example_String,',',1,2)+1) AS address FROM dual;
0 голосов
/ 13 июля 2020

Вам действительно не нужны регулярные выражения; instr + substr отлично справляются с работой, так как это довольно простая задача.

SQL> create or replace procedure p_test (par_string in varchar2) is
  2    -- comma positions
  3    l_pos1    number := instr(par_string, ',', 1, 1);
  4    l_pos2    number := instr(par_string, ',', 1, 2);
  5    l_pos3    number := instr(par_string, ',', 1, 3);
  6    -- variables
  7    l_name    varchar2(200);
  8    l_id      varchar2(200);
  9    l_address varchar2(200);
 10  begin
 11    l_name    := substr(par_string, 1, l_pos1 - 1);
 12    l_id      := substr(par_string, l_pos1 + 1, l_pos2 - l_pos1 - 1);
 13    l_address := substr(par_string, l_pos2 + 1);
 14
 15    dbms_output.put_line('Name    = ' || l_name);
 16    dbms_output.put_line('ID      = ' || l_id);
 17    dbms_output.put_line('Address = ' || l_address);
 18  end;
 19  /

Procedure created.

Тестирование:

SQL> set serveroutput on
SQL> exec p_test('Little Foot,25,Manhattan 23 New York');
Name    = Little Foot
ID      = 25
Address = Manhattan 23 New York

PL/SQL procedure successfully completed.

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