PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Posso fazer uma função plpgsql retornar um inteiro sem usar uma variável?


Sim você pode. Existem várias maneiras.

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 um OUT ou 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;

Mais no manual aqui.

3) (Ab)use IN parâmetro


Desde o Postgres 9.0 você também pode usar parâmetros de entrada como variáveis. As notas de lançamento para 9.0:

Um parâmetro de entrada agora age como uma variável local inicializada para o valor passado.
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;

Com os últimos que você usa uma variável implicitamente, mas você não precisa DECLARE explicitamente (conforme solicitado).

4) Use um DEFAULT valor com um INOUT parâmetro


Este é um caso um pouco especial. O corpo da função pode estar vazio.
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 é uma notação curta para INOUT _col1 integer DEFAULT 123 . Mais:
  • O operador de atribuição esquecido "=" e o lugar-comum ":="

5) Em vez disso, use uma função SQL simples

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;