Postgres 9.6:returns 字符串数组的函数
Postgres 9.6 : Function that returns array of strings
我正在尝试创建 return text/varchar 类型数组的函数。这是一个例子:
CREATE OR REPLACE FUNCTION schema.someFunction(text, text, text)
RETURNS character varying[]
LANGUAGE plpgsql
AS $function$
DECLARE
i text;
arr_len varchar[];
BEGIN
FOR i in (select string_to_array(,','))
LOOP
arr_len := schema.someOtherFunctionThatReturnsText(i::text, , )::varchar;
END LOOP;
RETURN arr_len;
END
$function$
;
此函数始终 returns NULL 行。我不明白为什么。有什么建议吗?
只是提一下 schema.someOtherFunctionThatReturnsText return 的文字,它工作正常。
This function returns NULL rows all the time. I don't get it why.
您在每次迭代时都覆盖了 arr_len
的值。当您将标量值(单个 text
值)分配给数组时,该函数的工作原理让我感到非常惊讶 - 实际上应该抛出一个错误,除非该函数 returns 一个文本数组(text[]
) 而不是 text
正如混淆的名字所暗示的那样。
您还错误地使用了 FOR 循环。 select string_to_array()
只是 returns 一个单独的数组,它不会遍历数组。另外,变量应该是一条记录,而不是 text
变量。
到loop over array elements,你需要使用FOREACH
,而不是带有select的FOR循环。然后您需要将函数调用的结果附加到结果变量。但是为了让它工作,你需要先初始化变量。
CREATE OR REPLACE FUNCTION some_function(text, text, text)
RETURNS text[]
LANGUAGE plpgsql
AS $function$
DECLARE
i text;
arr_len text[] := array[]::text[]; -- initialize the array
BEGIN
FOREACH i in ARRAY string_to_array(p_elements,',')
LOOP
arr_len := arr_len || schema.someotherfunctionthatreturnstext(i::text, , ));
END LOOP;
RETURN arr_len;
END
$function$
;
但是你把整个事情复杂化了。
为此您不需要循环或 PL/pgSQL:
只需取消嵌套您获得的数组并使用 array_agg()
到 assemble 结果:
CREATE OR REPLACE FUNCTION schema.some_function(text, text, text)
RETURNS text[]
LANGUAGE sql
AS
$function$
select array_agg(schema.someotherfunctionthatreturnstext(x.element, , )::text)
from unnest(string_to_array(,',')) as x(element);
$function$
;
最好使用适当的数组类型(例如 text[]
)声明参数,而不是依赖逗号分隔的文本值。请使用参数名称而不是 </code> 或 <code>
以便整个函数更易于阅读(和维护)
我正在尝试创建 return text/varchar 类型数组的函数。这是一个例子:
CREATE OR REPLACE FUNCTION schema.someFunction(text, text, text)
RETURNS character varying[]
LANGUAGE plpgsql
AS $function$
DECLARE
i text;
arr_len varchar[];
BEGIN
FOR i in (select string_to_array(,','))
LOOP
arr_len := schema.someOtherFunctionThatReturnsText(i::text, , )::varchar;
END LOOP;
RETURN arr_len;
END
$function$
;
此函数始终 returns NULL 行。我不明白为什么。有什么建议吗?
只是提一下 schema.someOtherFunctionThatReturnsText return 的文字,它工作正常。
This function returns NULL rows all the time. I don't get it why.
您在每次迭代时都覆盖了 arr_len
的值。当您将标量值(单个 text
值)分配给数组时,该函数的工作原理让我感到非常惊讶 - 实际上应该抛出一个错误,除非该函数 returns 一个文本数组(text[]
) 而不是 text
正如混淆的名字所暗示的那样。
您还错误地使用了 FOR 循环。 select string_to_array()
只是 returns 一个单独的数组,它不会遍历数组。另外,变量应该是一条记录,而不是 text
变量。
到loop over array elements,你需要使用FOREACH
,而不是带有select的FOR循环。然后您需要将函数调用的结果附加到结果变量。但是为了让它工作,你需要先初始化变量。
CREATE OR REPLACE FUNCTION some_function(text, text, text)
RETURNS text[]
LANGUAGE plpgsql
AS $function$
DECLARE
i text;
arr_len text[] := array[]::text[]; -- initialize the array
BEGIN
FOREACH i in ARRAY string_to_array(p_elements,',')
LOOP
arr_len := arr_len || schema.someotherfunctionthatreturnstext(i::text, , ));
END LOOP;
RETURN arr_len;
END
$function$
;
但是你把整个事情复杂化了。
为此您不需要循环或 PL/pgSQL:
只需取消嵌套您获得的数组并使用 array_agg()
到 assemble 结果:
CREATE OR REPLACE FUNCTION schema.some_function(text, text, text)
RETURNS text[]
LANGUAGE sql
AS
$function$
select array_agg(schema.someotherfunctionthatreturnstext(x.element, , )::text)
from unnest(string_to_array(,',')) as x(element);
$function$
;
最好使用适当的数组类型(例如 text[]
)声明参数,而不是依赖逗号分隔的文本值。请使用参数名称而不是 </code> 或 <code>
以便整个函数更易于阅读(和维护)