如何在plpgsql中读写psql变量

Posted

技术标签:

【中文标题】如何在plpgsql中读写psql变量【英文标题】:How to read and write psql variables in plpgsql 【发布时间】:2019-05-01 15:49:47 【问题描述】:

我需要读取 plpgsql 中的 psql 变量。似乎没有办法做到这一点,至少我还没有看到解决方案。

1) 在 psql 中存储一些 var 2)在plpgsql中读取这个var并将另一个var存储在plpgsql中作为psql 多变的 3) 在 SQL 查询中读取最终的 psql 变量

试过 var := :var (不工作) 在 plpgsql 中尝试了 \gset(不工作) 不知道如何继续

            \set var1 100

            SELECT :var1 AS var1;
            >>
            var1
            ------
             100
            (1 row)
            --All good

             --Assign psql variable using \gset
            SELECT 200 AS var2 \gset

            SELECT :var2 AS var2;
            >>
            var2
            ------
             200
            --All good


            DO $$
            DECLARE
            var3 int;
            BEGIN
                --I want to get psql variable var2. This doesn't work
                var3 := :var2;
                --I want to store var3 to psql variable using \gset method. This doesn't work either
                EXECUTE 'SELECT ' || var3 || ' AS var3 \\gset';
            END $$;

            >>
            ERROR:  syntax error at or near ":"
            LINE 6: var3 := :var2;
                            ^

            --This is what I want in the end
            SELECT :var3 AS var3;
            >>
            ERROR:  syntax error at or near ":"
            LINE 1: SELECT :var3 AS var3;
                           ^
            --This obviously doesn't work

我想在 plpgsql 中读取 psql 变量,然后对它们做一些事情并作为新的 psql 变量存储回来,以便稍后在 sql 查询中读取(OUTSIDE plpgsql !!!)。

【问题讨论】:

【参考方案1】:

你不能这样做。 psql 是客户端 - plpgsql 是服务器端编程环境。这两个应用程序都在不同的环境中运行——理论上并且通常在不同的计算机上,并且每次都在不同的进程中。所以你不能从plpgsql 触摸psql 变量。不支持此功能。

有一种解决方法 - 您可以使用服务器端配置变量,这些变量可从 SQL 语言访问,然后可从(客户端、服务器)端访问。

【讨论】:

以上是关于如何在plpgsql中读写psql变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Postgres/plpgsql 的视图定义中使用变量

psql 必须是扩展 plpgsql 的所有者

plpgsql 专家:(记录集)函数的输入和输出

如何在 psql 中使用脚本变量?

psql如何传各种变量

需要使用 plpgsql 函数截断表