| 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>>> |
9.3.1 Declaring Function Parameters
Parameters passed to functions are named with the identifiers
$1, $2,
etc. Optionally, aliases can be declared for
$n
parameter names for increased readability. Either the alias or the
numeric identifier can then be used to refer to the parameter value.
There are two ways to create an alias. The preferred way is to give a
name to the parameter in the CREATE FUNCTION command,
for example:
CREATE FUNCTION sales_tax(subtotal real) RETURNS real AS $$
BEGIN
RETURN subtotal * 0.06;
END;
$$ LANGUAGE plpgsql;
The other way, which was the only way available before PostgreSQL 8.0, is to explicitly declare an alias, using the declaration syntax
name ALIAS FOR $n;
The same example in this style looks like:
CREATE FUNCTION sales_tax(real) RETURNS real AS $$
DECLARE
subtotal ALIAS FOR $1;
BEGIN
RETURN subtotal * 0.06;
END;
$$ LANGUAGE plpgsql;
Note: These two examples are not perfectly equivalent. In the first case,
subtotalcould be referenced assales_tax.subtotal, but in the second case it could not. (Had we attached a label to the inner block,subtotalcould be qualified with that label, instead.)
Some more examples:
CREATE FUNCTION instr(varchar, integer) RETURNS integer AS $$
DECLARE
v_string ALIAS FOR $1;
index ALIAS FOR $2;
BEGIN
-- some computations using v_string and index here
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION concat_selected_fields(in_t sometablename)
RETURNS text AS $$
BEGIN
RETURN in_t.f1 || in_t.f3 || in_t.f5 || in_t.f7;
END;
$$ LANGUAGE plpgsql;
When a PL/pgSQL function is declared
with output parameters, the output parameters are given
$n names and optional
aliases in just the same way as the normal input parameters. An
output parameter is effectively a variable that starts out NULL;
it should be assigned to during the execution of the function.
The final value of the parameter is what is returned. For instance,
the sales-tax example could also be done this way:
CREATE FUNCTION sales_tax(subtotal real, OUT tax real) AS $$
BEGIN
tax := subtotal * 0.06;
END;
$$ LANGUAGE plpgsql;
Notice that we omitted RETURNS real---we could have
included it, but it would be redundant.
Output parameters are most useful when returning multiple values. A trivial example is:
CREATE FUNCTION sum_n_product(x int, y int, OUT sum int, OUT
prod int) AS $$
BEGIN
sum := x + y;
prod := x * y;
END;
$$ LANGUAGE plpgsql;
As discussed in section 5.4.4 SQL Functions with Output Parameters, this
effectively creates an anonymous record type for the function's
results. If a RETURNS clause is given, it must say
RETURNS record.
Another way to declare a PL/pgSQL function
is with RETURNS TABLE, for example:
CREATE FUNCTION extended_sales(p_itemno int)
RETURNS TABLE(quantity int, total numeric) AS $$
BEGIN
RETURN QUERY SELECT quantity, quantity * price FROM sales
WHERE itemno = p_itemno;
END;
$$ LANGUAGE plpgsql;
This is exactly equivalent to declaring one or more OUT
parameters and specifying RETURNS SETOF
sometype.
When the return type of a PL/pgSQL
function is declared as a polymorphic type (anyelement,
anyarray, anynonarray, or anyenum),
a special parameter $0
is created. Its data type is the actual return type of the function,
as deduced from the actual input types (see section 5.2.5 Polymorphic Types).
This allows the function to access its actual return type
as shown in section 9.3.3 Copying Types.
$0 is initialized to null and can be modified by
the function, so it can be used to hold the return value if desired,
though that is not required. $0 can also be
given an alias. For example, this function works on any data type
that has a + operator:
CREATE FUNCTION add_three_values(v1 anyelement, v2
anyelement, v3 anyelement)
RETURNS anyelement AS $$
DECLARE
result ALIAS FOR $0;
BEGIN
result := v1 + v2 + v3;
RETURN result;
END;
$$ LANGUAGE plpgsql;
The same effect can be had by declaring one or more output parameters as
polymorphic types. In this case the
special $0 parameter is not used; the output
parameters themselves serve the same purpose. For example:
CREATE FUNCTION add_three_values(v1 anyelement, v2
anyelement, v3 anyelement,
OUT sum anyelement)
AS $$
BEGIN
sum := v1 + v2 + v3;
END;
$$ LANGUAGE plpgsql;
| ISBN 9781906966065 | The PostgreSQL 9.0 Reference Manual - Volume 2 - Programming Guide | See the print edition |