oracle - update - ¿Variable global basada en la sesión en el procedimiento almacenado de Postgresql?
procedimientos anonimos oracle (6)
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.
Aquí está la sintaxis para PL / SQL para declarar g_spool_key como un 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;
¿Cómo implementaría una variable global basada en sesión con PLpg / SQL?
De los foros de Postgresql ...
Entonces, un par de preguntas ...
- ¿Puedes declarar valores globales desde plpgsql?
- Si es así, ¿hay alguna manera de evitar la contaminación del espacio de nombres? (tal vez el equivalente al uso de Oracle de las variables del paquete plsql)
plpgsql no tiene variables globales.
Podría definir algunas clases de variables personalizadas en su postgresql.conf y usarlas como variables de conexión en su procedimiento almacenado. Ver los documentos .
Ejemplo de uso para un "imos" de clase de variable personalizado:
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 puede usar la función incorporada current_setting (''imos.testvar'') .
Lamentablemente no hay variables globales en PL / pgSQL, aunque puede encontrar otras en otros lenguajes PL que vienen con PostgreSQL, específicamente en PL / Perl , PL / Python y PL / Tcl
Otra opción sería crear una tabla temporal y usarla para almacenar todas sus variables temporales
CREATE TEMPORARY TABLE tmp_vars(
name varchar(64),
value varchar(64),
PRIMARY KEY (name)
);
Incluso podría crear un procedimiento almacenado para administrar todo, creando la tabla si aún no existe. Uno para recuperación y otro para almacenamiento.
Un script de ejemplo PL/pgsql
que almacena y recupera 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;
PostgreSQL no admite variables globales (sesión), pero debe usar algunos trucos
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
saludos Pavel Stehule