postgresql - 在 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 版本..
解决方案
我有一个我认为是类似的问题,我想要一种方法来在一个批处理中执行具有多个结果集的脚本。
如上所述,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 中执行它。
推荐阅读
- c++ - 在 C++ 中使用字符串时在线编译器出现运行时错误
- mongodb - 恢复 mongodb `--dbpath`
- python - 重命名在另一个模型中用作超类的模型
- c# - 将“WebView 6.0.0”添加到项目时出错
- listview - Flutter ListView 不使用 setState() 刷新 UI,尽管 itemCount 和附加列表正确更新
- .net - 在没有 DLL 的项目中包含 Newtonsoft Json.NET
- curl - 即使指定了 Content-Length,cURL POST 错误 411
- javascript - 正则表达式 Razor 页面逗号和点
- android - 在没有 ListView 的 ScrollView 中动态添加视图
- javascript - 运行笑话单元测试时无法识别 Firebase