我可以让plpgsql函数返回一个整数而不使用变量吗?

dan*_*car 30 postgresql variables parameters function 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;
Run Code Online (Sandbox Code Playgroud)

我想避免DECLARE这样做.

Erw*_*ter 69

是的你可以.有很多方法.

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;
Run Code Online (Sandbox Code Playgroud)

2)使用OUTINOUT参数

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;
Run Code Online (Sandbox Code Playgroud)

更多在手册中.

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;
Run Code Online (Sandbox Code Playgroud)

对于最后一个,您可以隐式使用变量,但您没有DECLARE明确地(根据请求).

4)使用DEFAULTINOUT参数的值

这是一个特例.

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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)