9

在 Oracle 的 PL/SQL 中,我可以使用包定义创建一个基于会话的全局变量。使用 Postgresql 的 PLpg/SQL,这似乎是不可能的,因为没有包,只有独立的过程和函数。

这是 PL/SQL 将 g_spool_key 声明为全局的语法...

CREATE OR REPLACE PACKAGE tox IS
        g_spool_key spool.key%TYPE := NULL;
        TYPE t_spool IS REF CURSOR RETURN spool%ROWTYPE;
        PROCEDURE begin_spool;
        PROCEDURE into_spool
            (
            in_txt IN spool.txt%TYPE
            );
        PROCEDURE reset_spool;
        FUNCTION end_spool
            RETURN t_spool;
        FUNCTION timestamp
            RETURN VARCHAR2;
    END tox;

如何使用 PLpg/SQL 实现基于会话的全局变量?

4

6 回答 6

6

您可以在 postgresql.conf 中定义一些自定义变量类,并将其用作存储过程中的连接变量。请参阅文档

自定义变量类“imos”的用法示例:

imos=> set imos.testvar to 'foobar';
SET
Time: 0.379 ms
imos=> show imos.testvar;
 imos.testvar
--------------
 foobar
(1 row)

Time: 0.333 ms
imos=> set imos.testvar to 'bazbar';
SET
Time: 0.144 ms
imos=> show imos.testvar;
 imos.testvar
--------------
 bazbar
(1 row)

在存储过程中,您可以使用内置函数current_setting('imos.testvar')

于 2009-01-06T16:59:07.357 回答
6

另一种选择是创建一个临时表,并使用它来存储所有临时变量

CREATE TEMPORARY TABLE tmp_vars( 
    name varchar(64),
    value varchar(64),
    PRIMARY KEY (name)
);

您甚至可以创建一个存储过程来管理所有内容,如果该表尚不存在,则创建该表。一个用于检索,一个用于存储。

于 2009-12-02T23:32:50.177 回答
3

PostgreSQL 不支持全局(会话)变量,但你应该使用一些技巧

http://www.pgsql.cz/index.php/PostgreSQL_SQL_Tricks_II#Any_other_session_variables http://www.postgresql.org/docs/8.3/static/plperl-global.html

关于 Pavel Stehule

于 2009-01-06T07:03:09.900 回答
3

不幸的是,PL/pgSQL 中没有全局变量,尽管您可以在 PostgreSQL 附带的其他 PL 语言中找到全局变量,特别是在PL/Perl、PL/Python 和 PL/Tcl

于 2009-09-05T03:56:36.703 回答
2

从表中存储和检索全局变量的示例PL/pgsql脚本:

CREATE TABLE global_vars (name TEXT PRIMARY KEY, value TEXT);

CREATE FUNCTION put_var(key TEXT, data TEXT) RETURNS VOID AS '
  BEGIN
    LOOP
        UPDATE global_vars SET value = data WHERE name = key;
        IF found THEN
            RETURN;
        END IF;
        BEGIN
            INSERT INTO global_vars(name,value) VALUES (key, data);
            RETURN;
        EXCEPTION WHEN unique_violation THEN
            -- do nothing, and loop to try the UPDATE again
        END;
    END LOOP;
  END;
' LANGUAGE plpgsql;

CREATE FUNCTION get_var(key TEXT) RETURNS TEXT AS '
  DECLARE
    result TEXT;
  BEGIN
    SELECT value FROM global_vars where name = key INTO result;
    RETURN result;
  END;
' LANGUAGE plpgsql;


CREATE FUNCTION del_var(key TEXT) RETURNS VOID AS '
  BEGIN
    DELETE FROM global_vars WHERE name = key;
  END;
' LANGUAGE plpgsql;
于 2012-01-11T08:19:20.793 回答
1

Postgresql 论坛...

所以,有几个问题......

  1. 你可以从 plpgsql 声明全局值吗?
  2. 如果是这样,有没有办法避免命名空间污染?(或许相当于Oracle使用plsql包变量)

plpgsql 没有全局变量。

于 2009-01-05T21:44:06.517 回答