2009-01-05 12 views
9

In Oracle PL/SQL kann ich eine sitzungsbasierte globale Variable mit der Paketdefinition erstellen. Mit Postgresqls PLpg/SQL scheint das nicht möglich, da es keine Pakete, sondern nur unabhängige Prozeduren und Funktionen gibt. HierSession-basierte globale Variable in PostgreSQL gespeicherte Prozedur?

ist die Syntax für PL/SQL als global zu erklären 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; 

Wie würde ich eine Sitzung implementieren basierte globale Variable mit PLpg/SQL?

Antwort

1

Vom Postgresql forums ...

Also, ein paar Fragen ....

  1. Können Sie globale Werte von plpgsql erklären?
  2. Wenn ja, gibt es eine Möglichkeit, die Namensraumverschmutzung zu vermeiden? (vielleicht das äquivalent zu Oracle Verwendung von plsql Paket Variablen)

plpgsql hat keine globalen Variablen.

6

Sie könnten einige benutzerdefinierte-Variable-Klassen verwenden, definieren in Ihre postgresql.conf und verwenden Sie es als Verbindungsvariablen in Ihrer gespeicherten Prozedur. Siehe die docs.

Anwendungsbeispiel für eine benutzerdefinierte-Variable-Klasse "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 gespeicherten Prozeduren können Sie die eingebaute in verwenden Funktion current_setting('imos.testvar').

+0

Sind diese individuell variabel Klassen wandelbar? – dacracot

+0

Ja, ich habe eine Klasse "imos" - psql output: imos => imos.testvar auf 'foobar' setzen; SET imos => anzeigen imos.testvar; imos.testvar -------------- foobar imos => imos.testvar auf 'bazbar' setzen; SET imos => anzeigen imos.testvar; imos.testvar -------------- bazbar –

+0

BTW, von PostgreSQL 9.2 kann jeder Einstellung ein Klassenname vorangestellt und die Unterstützung des Parameters custom_variable_classes entfernt werden (siehe https: // www.postgresql.org/docs/current/static/release-9-2.html#AEN111020) – Nashev

1

Leider gibt es keine globalen Variablen in PL/pgSQL, obwohl man diejenigen in anderen PL Sprachen, die kommen mit PostgreSQL, speziell in PL/Perl, PL/Python und PL/Tcl

4

Eine andere Möglichkeit wäre, finden zu erstellen eine temporäre Tabelle, und verwenden Sie es alle Ihre temporären Variablen speichern

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

Sie könnten sogar eine gespeicherte Prozedur erstellen, alles zu verwalten, um die Tabelle zu schaffen, wenn es noch nicht existiert. Eine zum Abrufen und eine zum Speichern.

1

Ein Beispiel PL/pgsql Skript, das speichert und globale Variablen aus einer Tabelle abruft:

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;