Глобальная переменная на основе сеанса в хранимой процедуре Postgresql? - PullRequest
9 голосов
/ 06 января 2009

В 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?

Ответы [ 6 ]

6 голосов
/ 06 января 2009

Вы можете определить некоторые пользовательские переменные-классы в вашем 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') .

4 голосов
/ 03 декабря 2009

Другой вариант - создать временную таблицу и использовать ее для хранения всех ваших временных переменных

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

Вы можете даже создать хранимую процедуру для управления всем, создавая таблицу, если она еще не существует Один для поиска и один для хранения.

3 голосов
/ 06 января 2009

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

С уважением Павел Стехуле

1 голос
/ 11 января 2012

Пример 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;
1 голос
/ 05 сентября 2009

К сожалению, в PL / pgSQL нет глобальных переменных, хотя вы можете найти их в других языках PL, поставляемых с PostgreSQL, в частности в PL / Perl , PL / Python и PL / Tcl

1 голос
/ 06 января 2009

Из форумов Postgresql ...

Итак, пара вопросов ....

  1. Можете ли вы объявить глобальные значения из plpgsql?
  2. Если это так, есть ли способ избежать загрязнения пространства имен? (возможно, эквивалентно использованию Oracle пакета plsql переменные)

У plpgsql нет глобальных переменных.

...