将 varchars 列表传递给 plpgsql 函数

passing a list of varchars into plpgsql function

我想准备一个可以调用的函数

select gettvmlistic3('IC','AUTABB',array['565,568,569,570,572,573,574,575,576,577,578'])

我函数的声明是

create or replace function getTVMListIC3(operatorName varchar,groupid varchar, ids varchar[])
returns varchar as $$
declare
tvms varchar[];
res varchar;
begin
EXECUTE format('SELECT ARRAY (SELECT id from "%s".dictionary where groupid = ''%s'' and id = ANY(''%s'') order by id)', operatorName, groupid, ids) INTO tvms;
SELECT ARRAY_TO_STRING(tvms, ',') INTO res;
return res;
end;
$$
language plpgsql;

但是我得到的结果是空的。事实上,我应该收到与提供的数组中相同数量的元素。我做错了什么?

您正在传递一个只有一个元素的数组。

如果你想传递多个元素你需要使用:

array['565','568','569','570','572','573','574','575','576','577','578']

但是你不应该像那样连接参数值。

在动态 SQL 中使用占位符 (</code>) 并使用 <code>USING 子句传递值。标识符应在 format() 函数中使用 %I 注入:

您也不需要先将 select 转换为数组,然后再将其转换为字符串。您可以立即将所有内容聚合到一个字符串中。

create or replace function getTVMListIC3(operatorName varchar, groupid varchar, ids varchar[])
  returns varchar 
as $$
declare
  res varchar;
begin
  EXECUTE format($sql$ 
                 SELECT string_agg(id::text, ',' order by id) 
                 from %I.dictionary 
                 where groupid =  
                   and id = ANY()
                 $sql$, operatorName) 
    INTO res
    using groupid, ids;

  return res;
end;
$$
language plpgsql

那些字符串看起来像数字。如果是这种情况,最好将参数定义为 int[] 然后将数字列表传递为:

array[565,568,569,570,572,573,574,575,576,577,578]