Можно ли заставить функцию plpgsql возвращать целое число без использования переменной? - PullRequest
29 голосов
/ 17 ноября 2011

Примерно так:

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;

Я бы хотел избежать DECLARE только для этого.

Ответы [ 2 ]

66 голосов
/ 17 ноября 2011

Да, вы можете. Есть несколько способов.

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) Используйте параметр OUT или 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;

Подробнее в руководстве здесь.

3) (Ab) использовать IN параметр

Начиная с Postgres 9.0 вы также можете использовать входные параметры в качестве переменных. Примечания к выпуску для 9.0:

Входной параметр теперь действует как локальная переменная, инициализированная переданным значением.

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;

С последними вы действительно используете переменную неявно, но вам не нужно DECLARE явно (по запросу).

4) Используйте значение DEFAULT с параметром INOUT

Это немного особый случай. Тело функции может быть пустым.

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 - краткая запись для INOUT _col1 integer DEFAULT 123. Подробнее:

5) Используйте простую функцию 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;
2 голосов
/ 11 октября 2016
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;
...