¿Puedo hacer que una función plpgsql devuelva un número entero sin usar una variable?

Algo como esto:

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; 

Me gustaría evitar un DECLARE solo por esto.

Sí tu puedes. Hay diferentes maneras.

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) Use un parámetro OUT o 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; 

Más en el manual aquí.

3) (Ab) usa el parámetro IN

Desde Postgres 9.0 también puede usar parámetros de entrada como variables. Las notas de la versión para 9.0:

Un parámetro de entrada ahora actúa como una variable local inicializada al valor pasado.

 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 los últimos, utiliza una variable implícitamente, pero no tiene que DECLARE explícitamente (según lo solicitado).

4) Use un valor DEFAULT con un parámetro INOUT

Este es un poco un caso especial.

 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 es una notación corta para INOUT _col1 integer DEFAULT 123 . Detalles:

  • El operador de asignación olvidado “=” y el lugar común “: =”

5) Use una función SQL simple en su lugar

 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; 
 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;