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

时间:2011-01-10 20:14:01

标签: postgresql stored-procedures plpgsql

我了解Oracle和PL / SQL

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

  • 程序。他们可以有 IN OUT IN OUT 参数,但没有返回值
  • 函数。他们可以拥有 IN OUT IN OUT 参数,并且必须返回值

但我是plpgsql的新手

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

所以这些是我的问题:

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

3 个答案:

答案 0 :(得分:14)

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参数,你将不得不创建一个有两个整数的类型或表来将数据转换为正确的类型:

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 :(得分:2)

......实际上我自己应该多搜索一下。答案就在文件页面上不远处:

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

答案 2 :(得分:0)

如果您指定了参数,则表示结果的结构

例如

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

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

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中,notice是一个可以添加处理程序以接收的事件。

raise notice 'my parameter = %', 11;
return query select * from mytable;
抱歉,我没说清楚。

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

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