Sessão baseada variável global no PostgreSQL procedimento armazenado?

votos
9

Em Oracle PL / SQL I pode criar uma variável global de sessão baseado com a definição do pacote. Com do PostgreSQL PLPG / SQL, não parece possível uma vez que não há pacotes, apenas procedimentos e funções independentes.

Aqui está a sintaxe para PL / SQL para declarar g_spool_key como um global ...

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;

Como eu poderia implementar uma sessão variável global baseada com PLPG / SQL?

Publicado 05/01/2009 em 22:09
fonte usuário
Em outras línguas...                            


6 respostas

votos
1

A partir dos fóruns PostgreSQL ...

Assim, um par de perguntas ....

  1. você pode declarar valores globais de plpgsql?
  2. Se assim for, há uma maneira de evitar a poluição do namespace? (Talvez o equivalente ao uso de variáveis ​​de pacote PLSQL da Oracle)

não plpgsql não tem variáveis ​​globais.

Respondeu 05/01/2009 em 22:44
fonte usuário

votos
3

O PostgreSQL não suporta variáveis ​​(sessão) globais, mas você deve usar alguns truques

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

refere Pavel Stehule

Respondeu 06/01/2009 em 08:03
fonte usuário

votos
6

Você poderia definir alguns personalizados-variable-classes em sua postgresql.conf e usá-lo como conexão-variáveis em sua-procedimento armazenado. Veja os docs .

Exemplo de uso para um costume-variável de classe "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)

In-procedimentos armazenados, você pode usar o built-in função current_setting ( 'imos.testvar') .

Respondeu 06/01/2009 em 17:59
fonte usuário

votos
1

Infelizmente, não existem variáveis globais em PL / pgSQL, embora você possa encontrar aqueles em outros idiomas PL que vêm com PostgreSQL, especificamente no PL / Perl , PL / Python e PL / Tcl

Respondeu 05/09/2009 em 04:56
fonte usuário

votos
4

Outra opção seria a criação de uma tabela temporária, e usá-lo para armazenar todas as suas variáveis ​​temporárias

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

Você pode até mesmo criar um procedimento armazenado para gerenciar tudo, criar a tabela se ele ainda não existe. Um para recuperação e um para o armazenamento.

Respondeu 03/12/2009 em 00:32
fonte usuário

votos
1

Um exemplo PL/pgsqlscript que armazena e recupera as variáveis globais de uma tabela:

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 IGNORE  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;
Respondeu 11/01/2012 em 09:19
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more