Можно ли заставить функцию plpgsql возвращать целое число без использования переменной?
Что-то вроде этого:
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 ответа
Решение
Да, ты можешь. Есть несколько способов.
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;
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;