【问题标题】:Can Postgres stored functions have both a return value AND out parameters?Postgres 存储函数可以同时具有返回值和输出参数吗?
【发布时间】: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 参数与返回值组合?这是一种常见的做法吗?你有这方面的例子吗?

【问题讨论】:

    标签: postgresql stored-procedures plpgsql


    【解决方案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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        • 1970-01-01
        • 2011-02-01
        • 2019-04-04
        • 1970-01-01
        • 1970-01-01
        • 2021-06-29
        相关资源
        最近更新 更多