PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Posso fare in modo che una funzione plpgsql restituisca un numero intero senza utilizzare una variabile?

Si, puoi. Ci sono diversi modi.

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) Usa un OUT o INOUT parametro

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;

Maggiori informazioni nel manuale qui.

3) (Ab)usa IN parametro

Da Postgres 9.0 puoi anche utilizzare parametri di input come variabili. Le note di rilascio per 9.0:

Un parametro di input ora agisce come una variabile locale inizializzata sul valore passato.

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;

Con gli ultimi che usate una variabile implicitamente, ma non è necessario DECLARE esplicitamente (come richiesto).

4) Usa un DEFAULT valore con un INOUT parametro

Questo è un caso un po' speciale. Il corpo della funzione può essere vuoto.

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 è una notazione breve per INOUT _col1 integer DEFAULT 123 . Altro:

  • L'operatore di assegnazione dimenticato "=" e il luogo comune ":="

5) Utilizzare invece una semplice funzione 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;