У меня есть следующая строка «3,45,543,6,89». Нужен вывод как таблица через функцию. Пожалуйста, помогите мне получить результат через функцию postgresql - PullRequest
0 голосов
/ 18 июня 2020
CREATE OR REPLACE FUNCTION public.SplitToTable(
iv_datalist  varchar,iv_Separator varchar)
    RETURNS TABLE(out_param varchar)  
    LANGUAGE 'plpgsql'

    COST 100
    VOLATILE 
    ROWS 1000
AS $BODY$
BEGIN

RETURN query select (select regexp_split_to_table(iv_datalist, iv_Separator) as out_param );

END
$BODY$;

Когда я запускаю

select * from splitToTable('3,34,4,545,35,3',',');

, я получаю эту ошибку:

ERROR:  structure of query does not match function result type
DETAIL:  Returned type text does not match expected type character varying in column 1.
CONTEXT:  PL/pgSQL function splittotable1(character varying,character varying) line 4 at RETURN QUERY
SQL state: 42804

1 Ответ

0 голосов
/ 18 июня 2020

Вам нужно будет объявить функцию как RETURNS text, а не RETURNS varchar. Используйте text везде, так как это предпочтительный тип строки в PostgreSQL. Таким образом, у вас не будет проблем с преобразованием типов.

Функцию можно было бы написать проще:

CREATE OR REPLACE FUNCTION public.SplitToTable(
   iv_datalist text,
   iv_Separator text
) RETURNS TABLE(out_param text)  
    LANGUAGE sql
    IMMUTABLE
AS
$BODY$SELECT * FROM regexp_split_to_table(iv_datalist, iv_Separator);$BODY$;

По сути, функция бесполезна; вы можете просто использовать regexp_split_to_table напрямую.

...