Postgresql 如何在不使用数组的情况下在postgres函数中传递值列表

Postgresql 如何在不使用数组的情况下在postgres函数中传递值列表,postgresql,list,plpgsql,Postgresql,List,Plpgsql,我需要创建一个函数,其中输入参数是一列值: Column1 Abc Xyz Mno Create or replace function dummy(my_list <list of 3 values>) returns refcursor as ....... $$ Open ref for select * from table1 where col1 in (my_list); Return ref E

我需要创建一个函数,其中输入参数是一列值:

Column1
Abc
Xyz
Mno
    
    

Create or replace function dummy(my_list <list of 3 values>) returns refcursor as
    .......
    $$
       Open ref for select * from table1 where col1 in (my_list);

       Return ref
    End;
    

您可以使用一个变量函数。本例使用整数并用SQL编写,但这没有什么区别:

CREATE FUNCTION dummy(VARIADIC args integer[]) RETURNS bigint
   LANGUAGE sql AS
'SELECT count(*)
FROM generate_series(1, 9) AS i
WHERE i = ANY (args)';

SELECT dummy(1, 5, 12);

 dummy 
-------
     2
(1 row)

SELECT dummy(1, 2, 5, 6, 9);

 dummy 
-------
     5
(1 row)
这样的函数可以用任意数量的参数调用,但除非您想编写C代码,否则它们都必须具有相同的类型


传递给这种可变参数的值必须是参数列表中的最后一个,它在函数体中形成一个数组。

另一个想法是将值列表作为文本传递给数组,可以转换为数组。有关数组语法的详细信息。 假设列表由文本值组成,则:

创建或替换函数dummymy_list text将refcursor返回为 ........ 打开表1中select*的ref,其中col1=any'{'| | | | |'}'::text[]; 在这里,您总是以文本形式传递值列表。
如果是整数值,则对于其他数据类型,“{'| | | |}”:text[]将变成“{'| | |}”:integer[]等。还请注意,值列表文本需要正确转义。

您试图通过不使用数组来解决什么问题?我们目前正在将整个oracle数据库迁移到postgres。在oracle中,我们有一些函数,其中返回或接受refcursor作为输入,并对其应用一些业务逻辑。对于这个特定场景,我们有一个API Mulesoft层,它直接向oracle发出查询,如:select*fron table where col1 in PALOAD。这里是一个值列表。我们希望所有的东西都能正常工作,这样API就不会直接运行任何查询。因此,我们需要一个函数,其中的输入将是有效负载,这是一个值列表,我们将返回一个游标到api,并返回结果?你能告诉我如何用2个输入调用这个函数吗。第一个是一个带有用户名的varchar,第二个是一个数组,根据您的建议,有多个值。函数内部的查询将是:从表1中选择*,其中col1=用户名,col2在数组_列表中;结果将在refcursor中返回。您能告诉我如何在PgAdmin中使用一些示例输入调用此函数来测试它吗。另外,你能告诉我,我是否可以使用一个类型的这个吗?类型是否只保存1条记录?我还想看看如何使用PLPGSql执行此操作如果我想将对象传递给多个行和列,该怎么办?我该怎么做?阵列也是唯一的方法吗?当然。因为每个数据类型在PostgreSQL中都自动有一个对应的数组类型,所以这没有问题。嗨,Laurenz,你能看到我最新的编辑和建议吗?Hi Stefavov.sm,你能看到我最新的编辑和建议吗?{'| | my|list | | | |'}'::text[]可以简化为字符串_to _ArrayMyU|list',“@GoutamSahoo在任何to中的更改=any@GoutamSahoo我猜es_forecast_period_ngf.fiscal_period是文本类型。为什么您需要i_b row1[]而不是i_b text[]并使用我的上述建议选择xyz'Q3 FY2031'、'Q3-M1、Q3-M2'?这是一个示例,其中我们使用的类型为1列。但最终我们会有2d数组,例如,一个带有col1和col2的类型,其中我们只想检查1列,比如说col2
CREATE FUNCTION dummy(VARIADIC args integer[]) RETURNS bigint
   LANGUAGE sql AS
'SELECT count(*)
FROM generate_series(1, 9) AS i
WHERE i = ANY (args)';

SELECT dummy(1, 5, 12);

 dummy 
-------
     2
(1 row)

SELECT dummy(1, 2, 5, 6, 9);

 dummy 
-------
     5
(1 row)