sql >> Base de Datos >  >> RDS >> PostgreSQL

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

Sí tu puedes. Hay varias formas.

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 parámetro

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)usar IN parámetro

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

Un parámetro de entrada ahora actúa como una variable local inicializada en el 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 que sí usas una variable implícitamente, pero no tienes que DECLARE explícitamente (según lo solicitado).

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

Este es un caso un poco especial. El cuerpo de la función puede estar vacío.

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 abreviada para INOUT _col1 integer DEFAULT 123 . Más:

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

5) Utilice 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;