una - linea de comandos postgresql
PostgreSQL: ¿Cómo pasar parámetros desde la línea de comando? (6)
Descubierto en PostgreSQL, usted puede PREPARE
declaraciones tal como lo hace en un lenguaje de scripting. Desafortunadamente, todavía no puedes usar ?
, pero puede usar la notación $n
.
Usando el ejemplo de arriba:
PREPARE foo(text,text,text) AS
SELECT *
FROM foobar
WHERE foo = $1
AND bar = $2
OR baz = $3 ;
EXECUTE foo(''foo'',''bar'',''baz'');
DEALLOCATE foo;
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 todo ?
con valores reales, en cambio 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'' };
En psql hay un mecanismo a través de
/set name val
comando, que se supone que está vinculado a la opción de línea de comandos -v name=val
. Citar es doloroso, en la mayoría de los casos es más fácil poner toda la carne de la pregunta dentro de un documento de shell.
Editar
Vaya, debería haber dicho -v
lugar de -P
(que es para las opciones de formato) la respuesta anterior lo hizo bien.
Parece que lo que preguntas no se puede hacer directamente desde la línea de comando . Tendrá que usar una función definida por el usuario en plpgsql o llamar a la consulta desde un lenguaje de scripting (y el último enfoque hace que sea un poco más fácil evitar la inyección de SQL).
Puede construir la cadena de consulta primero usando variables de sistema operativo y luego pasarlo a PSQL de esta manera:
FOO=FOOVALUE
BAR=BARVALUE
BAZ=BAZVALUE
Q1="select * from foobar where foo=${FOOVALUE} and bar=${BARVALUE} or baz=${BAZVALUE};"
PSQL [your connection parameters] -c "${Q1}"
Puede usar la construcción -v por ejemplo
psql -v v1=12 -v v2="''Hello World''"
y luego consulte las variables en sql como: v1,: v2, etc.
select * from table_1 where id = :v1;
También puede pasar los parámetros en la línea de comando psql, o desde un archivo por lotes. Las primeras declaraciones recopilan los detalles necesarios para conectarse a su base de datos.
La solicitud final solicita los valores de restricción, que se usarán en la columna IN () de la columna WHERE. Recuerde hacer comillas simples en cadenas y separarlas por comas:
@echo off
echo "Test for Passing Params to PGSQL"
SET server=localhost
SET /P server="Server [%server%]: "
SET database=amedatamodel
SET /P database="Database [%database%]: "
SET port=5432
SET /P port="Port [%port%]: "
SET username=postgres
SET /P username="Username [%username%]: "
SET /P bunos="Enter multiple constraint values for IN clause [%constraints%]: "
ECHO you typed %constraints%
PAUSE
REM pause
"C:/Program Files/PostgreSQL/9.0/bin/psql.exe" -h %server% -U %username% -d %database% -p %port% -e -v v1=%constraints% -f test.sql
Ahora en su archivo de código SQL, agregue el token v1 dentro de su cláusula WHERE, o en cualquier otro lugar en el 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:
SELECT * FROM myTable
WHERE NOT someColumn IN (:v1);
En Windows, guarde todo el archivo como un archivo DOS BATch (.bat), guarde el archivo test.sql en el mismo directorio y ejecute el archivo por lotes.
Gracias por Dave Page, de EnterpriseDB, por el guión original solicitado.