我可以声明一个带有任何类型数组的postgres函数吗?

时间:2018-05-15 15:39:03

标签: postgresql plpgsql

即我需要一个可以像这样调用的函数

select myfunc({1,'foo', true})

select myfunc({42.0,7, false, x'ff'})

100%清楚我真的想要

select myfunc(array[col1,col2,col3])

其中col1,col2,col3属于不同类型。也许这会对答案产生影响

2 个答案:

答案 0 :(得分:1)

https://www.postgresql.org/docs/current/static/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC

  

声明为anyelement的每个位置(参数或返回值)都允许具有任何特定的实际数据类型,但在任​​何给定的调用中,它们必须都是相同的实际类型。声明为anyarray的每个位置都可以具有任何数组数据类型,但类似地,它们必须都是相同的类型。

函数可以接受anyarray,它实际上是任何相同类型的值数组,而不是在一个数组中混合的任何类型的数组...

你可能会寻找的东西是:

so=# create function ae(i anyelement) returns anyelement as $$
begin
raise info '%',i::text; return i;
end;
$$ language plpgsql
;
CREATE FUNCTION
so=# create table pm100(f float,b bool, t bytea);
CREATE TABLE
so=# select ae((42.0, false, '\xff')::pm100);
INFO:  (42,f,"\\xff")
       ae
----------------
 (42,f,"\\xff")
(1 row)

答案 1 :(得分:1)

不,你不能这样做 - @Vao Tsun的回复是绝对正确的。 PostgreSQL SQL语言非常静态 - 比如C或Pascal。动态功能很少,但这些功能有限。

任何查询都有两个阶段 - 计划和执行。并且必须在计划时间内知道任何值的数据类型(动态查询和记录类型是例外 - 但仅在PLpgSQL中本地)。因为在执行之前必须知道所有类型,所以PostgreSQL不允许包含类型动态值的功能 - 比如多态集合。

对于常量值,可以为您的案例提供解决方法。您可以使用“any”类型的参数编写可变参数函数。它只对常量值有意义 - 类型在计划时间中是已知的,并且此函数只能在C语言中实现。例如,format函数属于这种类型。

一些动态工作的必要性是“破碎”设计的信号。从PostgreSQL的角度看“破碎”。某些模式无法在Postgres中实现,并且更好地在外部或使用不同类型的软件实现。