postgresql - 我可以让 plpgsql 函数在不使用变量的情况下返回一个整数吗?

标签 postgresql function variables parameters 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

最佳答案

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

1) 返回(选择...)

CREATE OR REPLACE FUNCTION get_1(_param_id integer)
  RETURNS integer
  LANGUAGE plpgsql AS
$func$
BEGIN
   RETURN _param_id;
-- Or:
-- RETURN (SELECT col1 FROM tbl WHERE id = _param_id);
END
$func$;

2) 使用OUTINOUT 参数

CREATE OR REPLACE FUNCTION get_2(_param_id integer, OUT _col1 integer)
-- RETURNS integer -- is optional noise in this case
  LANGUAGE plpgsql AS  
$func$
BEGIN
   SELECT INTO _col1  col1 FROM tbl WHERE id = _param_id;

   -- also valid, but discouraged:
   -- _col1 := col1 FROM tbl WHERE id = _param_id;
END
$func$;

More in the manual here.

3) (Ab)使用IN参数

Postgres 9.0 开始,您还可以使用输入参数 作为变量。 The release notes for 9.0:

An input parameter now acts like a local variable initialized to the passed-in value.

CREATE OR REPLACE FUNCTION get_3(_param_id integer)
  RETURNS integer
  LANGUAGE plpgsql AS
$func$
BEGIN
   SELECT INTO _param_id  col1 FROM tbl WHERE id = _param_id;
   RETURN _param_id;

   -- Also vlaid, but discouraged:
   -- $1 := col1 FROM tbl WHERE id = $1;
   -- RETURN $1;
END
$func$;

变体 2) 和 3) 确实使用隐式变量,但您不必(根据要求)显式地DECLARE

4) 使用带有INOUT 参数的DEFAULT

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

CREATE OR REPLACE FUNCTION get_4(_param_id integer, INOUT _col1 integer = 123)
  RETURNS integer
  LANGUAGE plpgsql AS
$func$
BEGIN
   -- You can assign some (other) value to _col1:
   -- SELECT INTO _col1  col1 FROM tbl WHERE id = _param_id;
   -- If you don't, the DEFAULT 123 will be returned.
END
$func$;

INOUT _col1 integer = 123INOUT _col1 integer DEFAULT 123 的缩写。见:

5) 使用普通 SQL function相反

CREATE OR REPLACE FUNCTION get_5(_param_id integer)
  RETURNS integer
  LANGUAGE sql AS
'SELECT col1 FROM tbl WHERE id = _param_id';

或者使用参数引用 $1 而不是参数名称。

变体 5) 对函数体使用普通单引号。全部都一样。见:

db<> fiddle here - 演示所有(包括调用)

关于postgresql - 我可以让 plpgsql 函数在不使用变量的情况下返回一个整数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8169676/

相关文章:

php - IBM Bluemix PostgreSQL 和 psql

C++通过多个函数返回类对象

mysql - 加载Birt报表时如何设置mysql用户变量

java - 在 Java 中用更少的代码初始化变量的更好方法是什么?

ruby-on-rails - 数据库连接错误?使用 Postgres

ruby-on-rails - Ruby on Rails 在 jsonb(哈希)中验证日期

PHP pg_connect 与 Docker 的连接时间变慢

r - 从 data.frame 分配唯一变量

sql - 如何在 SQL 中创建带有 2 个参数的函数?

arrays - 在 Perl 中使用变量的内容引用数组中的元素