| The PostgreSQL 9.0 Reference Manual - Volume 2 - Programming Guide
by The PostgreSQL Global Development Group Paperback (6"x9"), 478 pages ISBN 9781906966065 RRP £14.95 ($19.95) Sales of this book support the PostgreSQL project! Get a printed copy>>> |
5.4.5 SQL Functions with Variable Numbers of Arguments
SQL functions can be declared to accept
variable numbers of arguments, so long as all the “optional”
arguments are of the same data type. The optional arguments will be
passed to the function as an array. The function is declared by
marking the last parameter as VARIADIC; this parameter
must be declared as being of an array type. For example:
CREATE FUNCTION mleast(VARIADIC arr numeric[]) RETURNS
numeric AS $$
SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);
$$ LANGUAGE SQL;
SELECT mleast(10, -1, 5, 4.4);
mleast
--------
-1
(1 row)
Effectively, all the actual arguments at or beyond the
VARIADIC position are gathered up into a one-dimensional
array, as if you had written
SELECT mleast(ARRAY[10, -1, 5, 4.4]); -- doesn't work
You can't actually write that, though--or at least, it will
not match this function definition. A parameter marked
VARIADIC matches one or more occurrences of its element
type, not of its own type.
Sometimes it is useful to be able to pass an already-constructed array
to a variadic function; this is particularly handy when one variadic
function wants to pass on its array parameter to another one. You can
do that by specifying VARIADIC in the call:
SELECT mleast(VARIADIC ARRAY[10, -1, 5, 4.4]);
This prevents expansion of the function's variadic parameter into its
element type, thereby allowing the array argument value to match
normally. VARIADIC can only be attached to the last
actual argument of a function call.
The array element parameters generated from a variadic parameter are
treated as not having any names of their own. This means it is not
possible to call a variadic function using named arguments ( Volume 1A: 2.3 Calling Functions), except when you specify
VARIADIC. For example, this will work:
SELECT mleast(VARIADIC arr := ARRAY[10, -1, 5, 4.4]);
but not these:
SELECT mleast(arr := 10); SELECT mleast(arr := ARRAY[10, -1, 5, 4.4]);
| ISBN 9781906966065 | The PostgreSQL 9.0 Reference Manual - Volume 2 - Programming Guide | See the print edition |