Есть ли функция для форматирования строки?
Современные языки программирования позволяют разработчику создавать строки с метками-заполнителями и заменять правильные значения функцией/методом, обычно называемым format.
Это может выглядеть так:
"Hi {0}! How are you?".format('John');
Есть ли какая-нибудь функция в SQL или PL/SQL с таким же поведением? Или какая тут лучшая практика?
Свободный перевод вопроса String formatting in Oracle (PL/)SQL от участника @tjati
Ответы (2 шт):
Воспользуйтеь пакетом UTL_LMS, а именно функцией format_message():
exec dbms_output.put_line (utl_lms.format_message ( -
'Привет %s! Как дела %s? На все %d?', 'Вася', 'Вася', 100));
Результат:
Привет Вася! Как дела Вася? На все 100?
Следует заметить:
- Работает только в PL/SQL блокe, но не в SQL запросе.
- Должны быть переданы значения для каждой метки-заполнителя:
%sдля строки,%dдля чисел.
Свободный перевод ответа от участника @Nick Krasnov
Можно создать пользовательский тип. Он более гибкий и его можно использовать в SQL:
select stringT (
'Привет {1}! Дашь {2} руб., {1}? ').format (varargs ('Вася', 100)) formated
from dual
/
FORMATED
----------------------------------
Привет Вася! Дашь 100 руб., Вася?
Реализация пользовательского типа:
create or replace type varargs as table of varchar2 (32)
/
create or replace type stringT as object (
s varchar2 (4000),
member function format (args varargs) return varchar2)
/
create or replace type body stringT as
member function format (args varargs) return varchar2 is
pos int;
ret varchar2 (4000) := self.s;
begin
for i in 1..regexp_count (ret, '{(\d+)}') loop
pos := regexp_substr (ret, '{(\d+)}', 1, 1, null, 1);
ret := regexp_replace (ret, '{(\d+)}', args(pos), 1, 1);
end loop;
return ret;
end;
end;
/