2009-01-05 17 views
9

En PL/SQL de Oracle puedo crear una variable global basada en sesión con la definición del paquete. Con PLpg/SQL de Postgresql, no parece posible ya que no hay paquetes, solo procedimientos y funciones independientes.¿Variable global basada en sesión en el procedimiento almacenado Postgresql?

Aquí se muestra la sintaxis de PL/SQL para declarar g_spool_key como un mundial ...

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; 

¿Cómo voy a poner en práctica una sesión variable global basada en PLPG/SQL?

Respuesta

1

Desde el Postgresql forums ...

Así, un par de preguntas ....

  1. ¿Se puede declarar los valores globales de plpgsql?
  2. Si es así, ¿hay alguna manera de evitar la contaminación del espacio de nombres? (quizás los equivalentes al uso de Oracle del paquete plsql variables)

plpgsql no tiene variables globales.

6

Se podría definir algunos personalizados-variable-clases en su postgresql.conf y utilícelo como variables de conexión en su procedimiento almacenado. Vea el docs.

ejemplo de uso de un clase a medida 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) 

En-procedimientos almacenados que se puede utilizar la función incorporada current_setting('imos.testvar').

+0

Son estos hechos a la variable-clases mutable? – dacracot

+0

sí, tengo una clase "imos" - psql salida: imos => establece imos.testvar a 'foobar'; SET imos => mostrar imos.testvar; imos.testvar -------------- foobar imos => establece imos.testvar a 'bazbar'; SET imos => mostrar imos.testvar; imos.testvar -------------- bazbar –

+0

BTW, de PostgreSQL 9.2 cualquier configuración puede tener el prefijo de cualquier nombre de clase y se eliminó el soporte del parámetro custom_variable_classes. (Ver https: // www.postgresql.org/docs/current/static/release-9-2.html#AEN111020) – Nashev

1

Lamentablemente no hay variables globales en PL/pgSQL, aunque se pueden encontrar los de otros idiomas PL que vienen con PostgreSQL, específicamente en PL/Perl, PL/Python y PL/Tcl

4

Otra opción sería crear una tabla temporal, y lo utilizan para almacenar todas sus variables temporales

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

incluso se podría crear un procedimiento almacenado para manejar todo, la creación de la tabla si no existe todavía. Uno para recuperación y otro para almacenamiento.

1

Un ejemplo PL/pgsql script que almacena y recupera las variables globales de una tabla:

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; 
Cuestiones relacionadas