PostgreSQL中的VARIADIC声明是什么意思?

bnlyeluc  于 12个月前  发布在  PostgreSQL
关注(0)|答案(3)|浏览(139)

在PostgreSQL 9.3.4版本说明中,它说:
确保规划器将等价的VARIADIC和非VARIADIC函数调用视为等价的(Tom Lane)
我搜索了PostgreSQL手册,找不到它的定义。
我发现它与函数参数的模式(IN,OUT,VARIADIC)有关,但我不明白它的意思?我什么时候想使用它?如果函数具有VARIADIC属性,在性能方面意味着什么?

mkh04yzy

mkh04yzy1#

可变参数函数是那些具有未定义数量的参数的函数,它们存在于许多编程和查询语言中。
对于PostgreSQL,你可以在http://www.postgresql.org/docs/9.1/static/xfunc-sql.html(35.4.5.参数个数可变的SQL函数)中找到一个例子:
实际上,在VARIADIC位置处或超出VARIADIC位置的所有实际参数都被收集到一个一维数组中,就像您编写了

gtlvzcf8

gtlvzcf82#

当你不确定参数的数量时,我们使用Variadic。
您可以参考VARIADIC FUNCTIONS IN POSTGRESQL了解详细信息。
参见有关Variadic functions的wiki:
在计算机程序设计中,变元函数(Variadic function)是一种不定元函数,也就是接受可变数量的参数的函数。

sdnqo3pr

sdnqo3pr3#

VARIADIC参数可以从调用方获取数组。
例如,在如下所示的函数中使用VARIADIC参数。* VARIADIC参数必须是最后一个参数,否则会出现错误:

CREATE FUNCTION my_func(VARIADIC nums INTEGER[]) RETURNS INTEGER
AS $$                -- ↑ Here ↑
BEGIN
  RETURN nums[1] + nums[2];
END;
$$ LANGUAGE plpgsql;

字符串
或者:

CREATE FUNCTION my_func(VARIADIC INTEGER[]) RETURNS INTEGER
AS $$                -- ↑ Here ↑
BEGIN
  RETURN $1[1] + $1[2];
END;
$$ LANGUAGE plpgsql;


然后,调用my_func(2, 3)返回5,如下所示。您必须向VARIADIC参数传递一个参数,否则会出现错误:

postgres=# SELECT my_func(2, 3);
 my_func
---------
       5
(1 row)

postgres=# SELECT my_func(VARIADIC ARRAY[2,3]);
 my_func
---------
       5
(1 row)


小心,调用my_func(ARRAY[2,3])会得到如下错误:

postgres=# SELECT my_func(ARRAY[2,3]);
ERROR:  function my_func(integer[]) does not exist
LINE 1: SELECT my_func(ARRAY[2,3]);
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit typ
e casts.


调用my_func()会得到如下错误:

postgres=# SELECT my_func();
ERROR:  function my_func() does not exist
LINE 1: SELECT my_func();
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type 
casts.
apple=#

相关问题