大概是这样的:

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分.

推荐答案

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

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 an OUT or INOUT parameter

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;

More in the manual here.

3) (Ab)use IN parameter

因为Postgres 9.0,你也可以用input parameters作为变量.The release notes for 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;

对于最后一个变量,您可以隐式地输入一个变量,但不必显式地输入它(根据请求).

4) Use a DEFAULT value with an INOUT parameter

这有点特殊.函数体可以为空.

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 = 123INOUT _col1 integer DEFAULT 123的缩写.更多:

5) Use a plain SQL function instead

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;

Postgresql相关问答推荐

当通过PostgreSQL FDW中的视图使用时,年龄函数的计算方式不同

正在应用序列化迁移,但数据库没有更改

锁定模式与PostgreSQL中的另一种锁定模式冲突到底是什么意思?

为什么我的唯一索引在 Postgresql 中不起作用?

postgres 中的模式前缀,被调用元素的范围

使用 pgx.CopyFrom 将 csv 数据批量插入到 postgres 数据库中

Django + Postgres + 大时间序列

postgresql中的外键可以被触发器违反

Windows PSQL 命令行: is there a way to allow for passwordless login?

获取带有时区偏移的日期

错误:syntax error at or near "user"

Postgres 在 WHERE id != int 查询中排除 NULL

?(问号)运算符在 Rails 中查询 Postgresql JSONB 类型

H2 postgresql mode模式似乎不起作用

适配器 Ecto.Adapters.Postgres 未编译

当成功有时会导致退出代码为 1 时,如何可靠地确定 pg_restore 是否成功?

python pip install psycopg2 安装错误

根据 Helm 图表设置值

如何在Postgres中分组并返回总和行

在 PostgreSQL 中使用 CASE 一次影响多个列