Oui, vous pouvez. Il existe plusieurs façons.
1) RETURN (SELECT ...)
CREATE OR REPLACE FUNCTION get(_param_id integer)
RETURNS integer AS
$func$
BEGIN
RETURN (SELECT col1 FROM TABLE WHERE id = _param_id);
END
$func$ LANGUAGE plpgsql;
2) Utiliser un OUT
ou INOUT
paramètre
CREATE OR REPLACE FUNCTION get(_param_id integer, OUT _col1 integer)
-- RETURNS integer -- "RETURNS integer" is optional noise in this case
AS
$func$
BEGIN
SELECT INTO _col1 col1 FROM TABLE WHERE id = _param_id;
-- also valid, but discouraged:
-- _col1 := col1 FROM TABLE WHERE id = _param_id;
END
$func$ LANGUAGE plpgsql;
Plus d'informations dans le manuel ici.
3) (Ab)utiliser IN
paramètre
Depuis Postgres 9.0 vous pouvez également utiliser des paramètres d'entrée comme variables. Les notes de version pour 9.0 :
Un paramètre d'entrée agit désormais comme une variable locale initialisée à la valeur transmise.
CREATE OR REPLACE FUNCTION get(_param_id integer)
RETURNS integer AS
$func$
BEGIN
SELECT INTO _param1 col1 FROM TABLE WHERE id = _param1;
RETURN _param1;
-- Also possible, but discouraged:
-- $1 := col1 FROM TABLE WHERE id = $1;
-- RETURN $1;
END
$func$ LANGUAGE plpgsql;
Avec les derniers que vous utilisez une variable implicitement, mais vous n'avez pas à DECLARE
explicitement (comme demandé).
4) Utilisez un DEFAULT
valeur avec un INOUT
paramètre
C'est un peu un cas particulier. Le corps de la fonction peut être vide.
CREATE OR REPLACE FUNCTION get(_param_id integer, INOUT _col1 integer = 123)
RETURNS integer AS
$func$
BEGIN
-- You can assign some (other) value to _col1:
-- SELECT INTO _col1 col1 FROM TABLE WHERE id = _param_id;
-- If you don't, the DEFAULT 123 will be returned.
END
$func$ LANGUAGE plpgsql;
INOUT _col1 integer = 123
est une notation courte pour INOUT _col1 integer DEFAULT 123
. Plus :
- L'opérateur d'affectation oublié "=" et le lieu commun ":="
5) Utilisez plutôt une fonction SQL simple
CREATE OR REPLACE FUNCTION get(_param_id integer)
RETURNS integer AS
$func$
SELECT col1 FROM TABLE WHERE id = _param_id;
-- use positional reference $1 instead of param name in Postgres 9.1 or older
$func$ LANGUAGE sql;