首页 > 解决方案 > 在 PostgreSQL 中为一个过程获取多个结果集

问题描述

我的要求是我想创建一个通用函数,我可以在其中传递任何其他函数及其参数,并且它应该返回适​​当的输出(即它可能是表结果或单个结果等)并且它应该在单个语句中.

这是我搜索并尝试过的,但我不想运行任何多个语句。

CREATE FUNCTION CustomerWithOrdersByState() RETURNS SETOF refcursor AS $$
    DECLARE
      ref1 refcursor;           -- Declare cursor variables
      ref2 refcursor;                             
    BEGIN
      OPEN ref1 FOR  SELECT * FROM "table1" limit 10;
    RETURN NEXT ref1;                                                                              

    OPEN ref2 FOR   SELECT * FROM "table2" limit 10;
    RETURN NEXT ref2; 

    END;
    $$ LANGUAGE plpgsql;

==================================================== =================

    begin;
    select * from CustomerWithOrdersByState();
       FETCH ALL FROM "<unnamed portal 31>";
      -- FETCH ALL FROM "<unnamed portal 30>";
    commit;

我正在使用 Postgres 11.4 版本..

标签: postgresqlpgadmin-4

解决方案


我有一个我认为是类似的问题,我想要一种方法来在一个批处理中执行具有多个结果集的脚本。

如上所述,PGAdmin4(以及我尝试过的许多其他客户端)似乎一次只处理一个命令,这意味着您必须选择一行,执行,选择下一个,执行......等等。

我发现似乎可行的一种快速方法是将脚本保存为单个文件,然后通过 PSQL 在 CLI 上执行它。

因此,例如,我创建了一个名为 myscript.sql 的文件,如下所示:

DROP TABLE IF EXISTS sampledata;
CREATE TABLE if not exists sampledata as select x,1 as c2,2 as c3, md5(random()::text) from generate_series(1,5) x;
  CREATE OR REPLACE FUNCTION GET_RECORDS(ref refcursor) RETURNS REFCURSOR AS $$
    BEGIN
      OPEN ref FOR SELECT * FROM SAMPLEDATA;   -- OPEN A CURSOR
      RETURN ref;                           -- RETURN THE CURSOR TO THE CALLER
    END;
    $$ LANGUAGE PLPGSQL;



/*
In PGManage, you would need to execute this commands one at a time (ie, 4 times).
*/
BEGIN;
    SELECT get_records('r1');
    FETCH ALL IN "r1";
COMMIT;

然后我创建了一个 bash 脚本 (runscript.sh),它允许轻松执行不同的文件。

#!/bin/bash
# Can be used to execute scripts. 
# Like this   ./runfile.sh hello.sql
psql -U xuser -d postgres < "$1"

我将脚本设置为可执行:

chmod a+x runscript.sh

然后执行如下:

./runscript.sh myscript.sql

脚本执行,我在 CLI 中看到了结果。我可以快速迭代文件,保存它并在 shell 中执行它。


推荐阅读