Estoy ejecutando un script plpgsql en Postgres 8.3 - Me gustaría pasar argumentos a este script a través de psql. Actualmente estoy ejecutando el script como:
psql -d database -u user -f update_file.sql
Encontré este enlace que explica la variable de entorno PGOPTIONS, pero eso no funciona para argumentos "personalizados". es decir, recibo un error porque la configuración no aparece en el archivo postgres.conf.
-bash-3.2$ export PGOPTIONS='--pretend=true'
-bash-3.2$ psql -d my_db -f update_database.sql
psql: FATAL: unrecognized configuration parameter "pretend"
¿Alguna otra idea? Idealmente, me gustaría evitar las variables de entorno ...
postgresql
psql
Jmoney38
fuente
fuente
-v
argumento de psql.Respuestas:
Estrictamente hablando, no existe un "script plpgsql": PL / pgSQL es el lenguaje de procedimiento predeterminado de PostgreSQL. Es un script SQL o una función / procedimiento plpgsql. Su ejemplo parece indicar un script SQL.
En su lugar, puede crear una función plpgsql (o sql) (del lado del servidor) que tome cualquier número de argumentos. Es muy simple siempre que los argumentos lo sean
values
. Se vuelve un poco más complicado si los argumentos incluyen identificadores. Entonces tendrá que usar PL / pgSQL con SQL dinámico yEXECUTE
.PL / pgSQL está preinstalado de forma predeterminada en PostgreSQL 9.0 o posterior. Sin embargo, debe instalarlo una vez por base de datos en Postgres 8.3:
Hablando de la versión: debería considerar actualizar a una versión actual de PostgreSQL. v8.3 es muy antiguo por ahora, al final de su vida útil a principios de 2013.
Como parece tener un script SQL listo, demostraré una función SQL. Función ficticia simple con dos argumentos enteros:
Puede encontrar muchos ejemplos más sofisticados para plpgsql aquí en dba.SE o en SO .
Puede llamar a esta función y entregar parámetros en un script de shell: ejemplo básico para una llamada en un script de shell que utiliza parámetros de entrada para parámetros enteros (no se necesitan comillas simples alrededor del valor):
O con cualquier tipo de datos:
-c
ejecuta una cadena de comando y luego sale. Más información sobre los argumentos de línea de comandos de psql en el manual .fuente
Para agregar otra funcionalidad para
-v
... Si está tratando de agregar la cita, agréguela en la línea de comando:y esto ejecutará el código para:
Lo mismo que
fuente
Prueba
-v
:Si desea usar
current_setting
andSET
osetval
, debe agregar una filapostgresql.conf
para agregar la opción.fuente
Desde mi experiencia, la desautorización de una variable psql dentro de una declaración plpgsql como en CREATE FUNCTION BEGIN o DO BEGIN da como resultado un error de sintaxis:
Mi solución es crear una tabla temporal con una sola columna y almacenar el valor en ella. Se puede acceder a esta tabla temporal a través de plpgsql y, por lo tanto, puedo pasar variables psql utilizadas en bloques DO.
Para usar variables psql adicionales en las declaraciones CREATE FUNCTION o DO, puede crear una columna por variable necesaria.
fuente
Esto no es muy elegante pero funciona (pseudocódigo):
fuente
Este enfoque le proporcionará una resolución completa en tiempo de ejecución de los entornos ... así que tan pronto como su script establezca de antemano todas las variables de shell a continuación funcionará ( se ha ejecutado miles de veces contra diferentes dbs y hosts ):
fuente