web-dev-qa-db-ja.com

Postgres 11のサーバー側プロシージャから複数の結果セットを返す

Postgresコンサルティング会社によるこの ブログ投稿 は、Postgres 11の新しいサーバー側プロシージャサポートが複数の結果セットを返すことができると述べています。

thisこの機能は実際にPostgres 11リリースに登場しましたか?

もしそうなら、それがどのように機能するかを簡単に説明できますか?コード例を示しますか?

3
Basil Bourque

この機能は実際にPostgres 11リリースに登場しましたか?

いいえ。ブログの投稿は "プロシージャからの動的な結果セット" パッチを参照していると思いますが、リリースされたバージョンには含まれていません。

2
Daniel Vérité

プロシージャから複数の結果セットを返すことができます-関数で常に可能であった方法と同様です:

create procedure getdata(result_one inout refcursor, result_two inout refcursor)
as
$$
begin
  open result_one for 
    select * 
    from (values (1,2,3), (4,5,6)) as t(a,b,c);

  open result_two for 
    select * 
    from (values ('one'),('two'),('three'),('four')) as p(name);
end;
$$
language plpgsql;

ただし、結果の表示は少し面倒です-少なくともpsqlでは:

postgres@localhost/postgres> \set AUTOCOMMIT off

postgres@localhost/postgres> call getdata(null, null);
     result_one     |     result_two
--------------------+--------------------
 <unnamed portal 1> | <unnamed portal 2>
(1 row)

postgres@localhost/postgres> fetch all "<unnamed portal 1>";
 a | b | c
---+---+---
 1 | 2 | 3
 4 | 5 | 6
(2 rows)

postgres@localhost/postgres> fetch all "<unnamed portal 2>";
 name
-------
 one
 two
 three
 four
(4 rows)

postgres@localhost/postgres>

ただし、一部のSQLクライアントは結果を自動的に表示できます。