Tengo una consulta algo detallada en un script que usa ?
marcadores de posición. Quería probar esta misma consulta directamente desde la línea de comando psql (fuera del script). Quiero evitar entrar y reemplazar todos los ?
valores con valores reales, en su lugar, me gustaría pasar los argumentos después de la consulta.
Ejemplo:
SELECT *
FROM foobar
WHERE foo = ?
AND bar = ?
OR baz = ? ;
Buscando algo como:
%> {select * from foobar where foo=? and bar=? or baz=? , 'foo','bar','baz' };
postgresql
parameters
vol7ron
fuente
fuente
Respuestas:
Puede usar la construcción -v, por ejemplo
y luego referirse a las variables en sql como: v1,: v2, etc.
Preste atención a cómo pasamos el valor de cadena / fecha usando dos comillas
" '...' "
fuente
\set v3 'another value'
. Solo recuerde, cuando necesite citar el valor en la declaración SQL, use apóstrofos alrededor del nombre de la variable, como este:SELECT * FROM foo WHERE bar = :'v3';
awk
psql -v v1=12 -v v2="'Hello World'" -v v3="'2010-11-12'" -c 'select * from table_1 where id = :v1;'
generará un error de sintaxis. Sin embargo, si bash es su shell, puede intentar:psql -v v1=12 -v v2="'Hello World'" -v v3="'2010-11-12'" <<< 'select * from table_1 where id = :v1;'
con buenos resultados.Descubierto en PostgreSQL, puede hacer
PREPARE
declaraciones como puede hacerlo en un lenguaje de programación. Desafortunadamente, todavía no puede usar?
, pero puede usar la$n
notación.Usando el ejemplo anterior:
fuente
foo
está ocupado y otroPREPARE
debería tener otro nombre mientras la sesión actual no esté cerrada. Si juegas conPREPARE
enpsql
, es difícil inventar cada vez un nuevo nombre yDEALLOCATE
puedes ayudar con él =)En psql hay un mecanismo a través del
comando, que se supone que está vinculado al
-v name=val
opción de la línea de comandos. Citar es doloroso. En la mayoría de los casos, es más fácil poner toda la carne de consulta dentro de un documento shell aquí.Editar
Ups, debería haber dicho en
-v
lugar de-P
(que es para opciones de formato) la respuesta anterior lo hizo bien.fuente
También puede pasar los parámetros en la línea de comandos psql o desde un archivo por lotes. Las primeras declaraciones recopilan los detalles necesarios para conectarse a su base de datos.
El mensaje final solicita los valores de restricción, que se utilizarán en la cláusula IN () de la columna WHERE. Recuerde poner comillas simples si son cadenas y separarlas por comas:
Ahora, en su archivo de código SQL, agregue el token v1 dentro de su cláusula WHERE, o en cualquier otro lugar del SQL. Tenga en cuenta que los tokens también se pueden usar en una declaración SQL abierta, no solo en un archivo. Guarde esto como test.sql:
En Windows, guarde todo el archivo como un archivo DOS BATch (.bat), guarde test.sql en el mismo directorio y ejecute el archivo batch.
Gracias a Dave Page, de EnterpriseDB, por la secuencia de comandos solicitada original.
fuente
Parece que lo que pregunta no se puede hacer directamente desde la línea de comandos . Tendrá que usar una función definida por el usuario en plpgsql o llamar a la consulta desde un lenguaje de scripting (y este último enfoque hace que sea un poco más fácil evitar la inyección de SQL).
fuente