Функция для замены всех имён в строке на их псевдонимы из таблицы?
Есть таблица псевдонимов:
Name nickname
vikram vik
James Jim
Robert Bob
Charles Dick
Richard Dick
Rich Dick
Хочу создать функцию для замены имен на псевдонимы из таблицы выше. Так хочу вызывать:
func_nicknames('vikram, James, Rajesh, Robert')
и хочу получить такой результат: 'vik, Jim, Rajesh, Bob'.
CREATE OR REPLACE FUNCTION func_nicknames( in_val varchar2)
RETURN VARCHAR2 IS
O_VAL VARCHAR2(100) := in_val;
BEGIN
SELECT REPLACE(O_VAL,t.name,t.nickname) INTO O_VAL
FROM nicknames t;
RETURN(O_VAL);
END func_nicknames;
Когда вызываю, получаю ошибку:
select func_nicknames ('vikram, James, Rajesh, Robert') result from dual
*
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
Совсем всё не так делаю, или можно устранить эту ошибку?
Свободный перевод вопроса Oracle function to replace all names to their nick names? от участника @Vikash Kumar
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Сначала нужно преобразовать параметр в табличную форму, остальное понятно и просто:
create or replace function getNicknames (names varchar2) return varchar2 is
ret varchar2 (32000);
begin
with names (name) as (
select trim (column_value)
from xmlTable (('"'||replace (names, ',', '","')||'"')) x
)
select
listagg (coalesce (nickname, na.name), ', ') within group (order by null) into ret
from names na
left join nicknames ni on ni.name=na.name;
return ret;
end;
/
Запустить и получить результат:
exec dbms_output.put_line ('result='||getNicknames ('vikram, James, Rajesh, Robert'));
result=vik, Jim, Rajesh, Bob