2009-01-05 4 views
9

Dans PL/SQL d'Oracle, je peux créer une variable globale basée sur la session avec la définition du package. Avec PLpg/SQL de Postgresql, cela ne semble pas possible car il n'y a pas de paquets, seulement des procédures et des fonctions indépendantes.Variable globale basée sur la session dans la procédure stockée Postgresql?

Voici la syntaxe PL/SQL pour déclarer g_spool_key comme mondiale ...

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; 

Comment puis-je mettre en œuvre une variable globale basée sur la session avec PLPG/SQL?

Répondre

1

De l'Postgresql forums ...

Alors, quelques questions ....

  1. Pouvez-vous déclarer des valeurs globales de plpgsql?
  2. Si oui, y a-t-il un moyen d'éviter la pollution des espaces de noms? (peut-être l'équivalent de l'utilisation d'Oracle du paquet PLSQL variables)

plpgsql ne sont pas des variables globales.

6

Vous pouvez définir certaines classes-sur mesure variable votre postgresql.conf et l'utiliser comme variables de connexion dans votre procédure stockée. Voir le docs.

Exemple d'utilisation pour une classe personnalisée variable « 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) 

Dans les procédures stockées, vous pouvez utiliser la fonction intégrée current_setting('imos.testvar').

+0

Sont ces classes-personnalisées variable mutable? – dacracot

+0

oui, j'ai une classe "imos" - sortie psql: imos => mettre imos.testvar à 'foobar'; SET imos => show imos.testvar; imos.testvar -------------- foobar imos => Définir imos.testvar sur 'bazbar'; SET imos => show imos.testvar; BTW, à partir de PostgreSQL 9.2 n'importe quel paramètre peut être préfixé par n'importe quel nom de classe et le support du paramètre custom_variable_classes a été supprimé (voir https: // imos.testvar -------------- bazbar –

+0

) www.postgresql.org/docs/current/static/release-9-2.html#AEN111020) – Nashev

1

Malheureusement, il n'y a pas de variables globales dans PL/pgSQL, mais vous pouvez trouver ceux dans d'autres langues PL qui viennent avec PostgreSQL, plus précisément dans PL/Perl, PL/Python et PL/Tcl

4

Une autre option serait de créer une table temporaire, et l'utiliser pour stocker toutes vos variables temporaires

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

Vous pouvez même créer une procédure stockée pour tout gérer, créer la table si elle n'existe pas encore. Un pour la récupération et un pour le stockage.

1

Un exemple de script PL/pgsql qui stocke et récupère les variables globales d'une table:

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; 
Questions connexes