Postgres 存储函数可以同时具有返回值和输出参数吗?

Posted

技术标签:

【中文标题】Postgres 存储函数可以同时具有返回值和输出参数吗?【英文标题】:Can Postgres stored functions have both a return value AND out parameters? 【发布时间】:2011-01-10 20:14:01 【问题描述】:

我知道 Oracle 和 PL/SQL

相比我对Oracle PL/SQL 的了解,我对PostgreSQL 的存储过程和plpgsql 不是很熟悉。在 Oracle 中,有两种类型的可调用对象:

程序。它们可以有INOUTIN OUT参数,但没有返回值 函数。它们可以有 INOUTIN OUT 参数,并且它们必须返回一个值

但我是 plpgsql 的新手

我了解在 plpgsql 中,所有存储过程都被视为functions。据我了解,这意味着它们可以(但不必)总是返回一个值。现在我在documentation page 上看到,我还可以在函数 上声明OUT 参数,这在Oracle 中是不可能的。但是我没有看到关于 OUT 参数是否可以与返回值组合的示例或任何明确的说明。我也看不到 IN OUT 参数是否可用。

所以这些是我的问题:

plpgsql 是否允许 IN OUT 参数? plpgsql 是否允许 OUT 参数与返回值组合?这是一种常见的做法吗?你有这方面的例子吗?

【问题讨论】:

【参考方案1】:

IN 和 OUT 基本上是旧语法的别名。

老办法:

create function test(param int) 
returns integer as 
$$ select 1 $$ 
language sql;

等效:

create function test(in param int, out int)
as $$ select 1 $$
langauge sql;

params 提供的是类型信息,它基本上为您的回报创建了一个匿名类型:

create function test(in param, out int, out int)
as $$ select 1, 2 $$
langauge sql;

现在你可以写了:

 select * from test(1);
 column1 | column2 
---------+---------
       1 |       2

如果没有 out 参数,您将不得不创建一个具有两个 int 的类型或表来将数据转换为正确的类型:

create or replace function test(in a int) 
returns record as 
as $$ select 1, 2 $$ 
language sql;
                                ^
select * from test(1);
ERROR:  a column definition list is required 
   for functions returning "record"

【讨论】:

+1 非常有趣的解释,谢谢!看起来 Postgres 的人使函数变得非常易于使用且非常有用!【参考方案2】:

...实际上我应该自己搜索一下。答案就在文档页面上:

http://www.postgresql.org/docs/current/static/sql-createfunction.html

【讨论】:

【参考方案3】:

如果你指定了 out 参数,这意味着你的结果的结构

例如。

create function test(in param, out int, out int)

将返回 2 列 int。到目前为止,在 postgre 中,我知道两种方法。

1返回setof refcursor并使用app读取。

create function test(in param) RETURNS setof refcursor AS
declare result refcursor;
declare parameters refcursor;
begin
 open result for select * from mytable;
 return next result;

 open parameter for select 11 as a, 22 as b;
 return next parameters;
end;

2 使用加薪通知。在 npgsql 中,通知是一个事件,您可以添加处理程序来接收。

raise notice 'my parameter = %', 11;
return query select * from mytable;

对不起,我没有说清楚。

1 使用'out' 参数是指定返回查询结构。你不能返回数据+变量。 postgre中的'out'并不意味着传递参数引用。

2 如果你想返回数据 + 变量,方法 1 或 2。

【讨论】:

以上是关于Postgres 存储函数可以同时具有返回值和输出参数吗?的主要内容,如果未能解决你的问题,请参考以下文章

postgres:具有无类型返回值的函数

Postgres存储函数如何返回表

Postgres:从存储函数返回结果或错误

如何存储我从 Postgres 存储函数返回的数据

C#获取存储过程返回值和输出参数值的方法

C#获取存储过程的 Return返回值和Output输出参数值