如何 运行 pgAdmin 中的真实程序并评估结果

How to run a true procedure in pgAdmin and evaluate results

我还没有看到任何问题涵盖我要问的所有问题,所以我在这里张贴我的旅程。

任务: 运行,在 pgAdmin 中,Postgres 中的 过程 (不是函数)。评估结果并将结果报告给屏幕上的用户。

对于我的情况,我有一个具有以下签名的程序:

CREATE OR REPLACE PROCEDURE sqls.transform_main(
    INOUT returnval integer)
LANGUAGE 'plpgsql'
...

如何做到这一点?

对我有用的答案:

编辑: listen virtual; 添加到下面的代码中)

DO
$$
declare x integer;
declare y text;
BEGIN
listen virtual;
call sqls.transform_main(x);
y = 'Return value: ' || x;
perform pg_notify('virtual', y);
END
$$

如果其他人可以对此进行改进,我会洗耳恭听。只是感谢一些事情,在这一点上,我在这项任务上花费的时间比我愿意承认的要多。

我把它放在这里是因为在评论中粘贴代码没有帮助。这是 psql 中的示例。它在 pgadmin 中类似,除了结果出现在数据输出中 window.

# CREATE OR REPLACE PROCEDURE test(
    INOUT returnval integer)
LANGUAGE 'plpgsql' AS
$$
BEGIN
  returnval := returnval;
END;
$$
;
CREATE PROCEDURE

# call test(1);
 returnval
-----------
         1
(1 row)

正在回复(带代码)Jeremy 的回复...

好的,我正在了解您的解决方案的工作原理。不过有一个问题...

我想传入一个实际变量,该变量的定义方式可以计算返回值。 (假设这是一个扩展脚本,我不想将其转换为另一个存储过程或函数...)

我可以按照你的方法来做吗?我想不,因为当我把它变成一个脚本(不是一个 SQL 调用)时,我丢失了我在你的版本中看到的 do 的输出,因为您注意到,在“数据输出”选项卡中。

DO
$$
declare return_val integer;
declare return_msg text;
declare notify_msg text := 0;
BEGIN
call test(return_val); -- I never see what this value is unless...
if (return_val != 0) then
    notify_msg = 'Failure (' || return_val || ')';
else
    notify_msg = 'success!';
end if;
RAISE NOTICE 'Return value is %', notify_msg; -- ...unless I do something like this
END
$$