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 中,有两种类型的可调用对象:
程序。它们可以有IN、OUT和IN OUT参数,但没有返回值 函数。它们可以有 IN、OUT 和 IN 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 存储函数可以同时具有返回值和输出参数吗?的主要内容,如果未能解决你的问题,请参考以下文章