ver update tabla procedimientos procedimiento modificar insertar eliminar ejecutar desde cursores crear consola anonimos almacenados almacenado oracle postgresql plsql plpgsql

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 ...

  1. ¿Puedes declarar valores globales desde plpgsql?
  2. 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;