2009-01-05 12 views
9

W Oracle PL/SQL mogę utworzyć zmienną globalną opartą na sesji z definicją pakietu. Z PLG/SQL PostgreSQL, nie wydaje się to możliwe, ponieważ nie ma pakietów, tylko niezależne procedury i funkcje.Zmienna globalna bazująca na sesji w PostgreSQL przechowywana procedura?

Oto składnia PL/SQL do deklarowania g_spool_key jako globalny ...

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; 

Jak zaimplementować sesję opartą zmienna globalna z PLpg/SQL?

Odpowiedz

1

Z Postgresql forums ...

więc kilka pytań ....

  1. można zadeklarować wartości globalnych z plpgsql?
  2. Jeśli tak, czy istnieje sposób na uniknięcie zanieczyszczenia przestrzeni nazw? (być może odpowiednik wykorzystania pakietu Oracle PLSQL zmienne)

plpgsql nie ma zmiennych globalnych.

6

Można zdefiniować kilka niestandardowych klas w zmiennej twój postgresql.conf i używaj go jako zmiennych-połączeń w Twojej przechowywanej procedurze. Zobacz docs.

Przykład użycia dla niestandardowej zmiennej klasy „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) 

W procedurach składowanych można użyć wbudowanej funkcji current_setting('imos.testvar').

+0

Czy te niestandardowych zmiennej klasy zmienny? – dacracot

+0

tak, mam klasę "imos" - wyjście psql: imos => ustaw imos.testvar na 'foobar'; ZESTAW imos => show imos.testvar; imos.testvar -------------- foobar imos => zestaw imos.testvar na "bazbar"; ZESTAW imos => show imos.testvar; imos.testvar -------------- bazbar –

+0

BTW, z PostgreSQL 9.2 każde ustawienie może być poprzedzone dowolną nazwą klasy, a obsługa parametru custom_variable_classes została usunięta (zobacz https: // www.postgresql.org/docs/current/static/release-9-2.html#AEN111020) – Nashev

1

Niestety nie istnieją zmienne globalne w PL/PGSQL, choć można znaleźć te w innych językach PL, które pochodzą z PostgreSQL, a konkretnie w PL/Perl, PL/Python i PL/Tcl

4

Innym rozwiązaniem byłoby stworzenie tabeli tymczasowej i używać go do przechowywania wszystkich zmiennych tymczasowych

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

można nawet utworzyć procedurę przechowywaną, aby zarządzać wszystkim, tworząc tabelę, jeśli jeszcze nie istnieje. Jeden do wyszukiwania i jeden do przechowywania.

1

Przykładem PL/pgsql skrypt, który pobiera i przechowuje zmienne globalne z tabeli:

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;