web-dev-qa-db-fra.com

Puis-je faire en sorte qu'une fonction plpgsql retourne un entier sans utiliser de variable?

Quelque chose comme ça:

CREATE OR REPLACE FUNCTION get(param_id integer)
  RETURNS integer AS
$BODY$
BEGIN
SELECT col1 FROM TABLE WHERE id = param_id;
END;
$BODY$
  LANGUAGE plpgsql;

Je voudrais éviter un DECLARE juste pour cela.

34
danidacar

Oui, vous pouvez. Il y a 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) Utilisez un paramètre OUT ou INOUT

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 dans le manuel ici.

3) (Ab) utilisez le paramètre IN

Depuis Postgres 9.0 , vous pouvez également utiliser les 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, vous utilisez une variable implicitement, mais vous n'avez pas besoin de DECLARE explicitement (comme demandé).

4) Utilisez une valeur DEFAULT avec un paramètre INOUT

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:

5) Utilisez plutôt un simple fonction SQL

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;
74
Erwin Brandstetter
CREATE or REPLACE FUNCTION get(i integer)
RETURNS integer as $id$
DECLARE
id integer;
BEGIN
SELECT column_id INTO id FROM table_name WHERE column_id=i;
RETURN id;
END;
$id$ LANGUAGE plpgsql;
2
Hrishikesh Jadhav