2012-10-08 92 views
13

Estaba intentando utilizar SQL dinámico para ejecutar algunas consultas en postgres.consulta SQL dinámica en postgres

Ejemplo:

EXECUTE format('SELECT * from result_%s_table', quote_ident((select id from ids where condition = some_condition))) 

tengo para consultar una tabla, que es del% s_table forma result_ en el que, necesito sustituir el nombre de tabla correcta (un id) a partir de una otra mesa.

me sale el error ERROR: prepared statement "format" does not exist

Enlace: string substitution with query result postgresql

Respuesta

21

EXECUTE ... USING sólo funciona en PL/PgSQL - es decir, dentro de las funciones o DO blocks escritos en el lenguaje PL/pgSQL. No funciona en SQL simple; el EXECUTE en SQL simple es completamente diferente, para ejecutar declaraciones preparadas. No puede usar SQL dinámico directamente en el dialecto SQL de PostgreSQL.

Compare:

Ver la segunda último par de my prior answer.


Además de no correr excepto en PL/SQL PgSQL su estado de cuenta que está mal, no va a hacer lo que usted espera. Si (select id from ids where condition = some_condition) devuelve decir 42, la instrucción fallaría si id es un número entero. Si se envía a texto obtendrá:

EXECUTE format('SELECT * from result_%s_table', quote_ident('42')); 
EXECUTE format('SELECT * from result_%s_table', '"42"'); 
EXECUTE 'SELECT * from result_"42"_table'; 

No es válido. Usted realmente quiere result_42_table o "result_42_table". Habría que escribir algo más como:

EXECUTE format('SELECT * from %s', quote_ident('result_'||(select id from ids where condition = some_condition)||'_table')) 

... si tiene que usar quote_ident.

+1

Sólo para complemento, un bloque 'DO' siempre devuelve nulo y no acepta parámetros así que creo que la OP se limita a una función. –

+1

@Clodoaldo Buen punto: pueden ejecutar el 'SELECT', pero no les servirá de nada a menos que hagan algo realmente indirecto como' SELECT ... INTO' en una tabla temporal. –

+1

@CraigRinger Hola, sé que llego un poco tarde a la fiesta, pero ¿pueden sugerirme algún buen tutorial para SQL dinámico en postgreSQL? No puedo encontrar ninguno. Quiero crear una consulta dinámica todo en uno. Marque [this] (https://stackoverflow.com/questions/48216935/pl-pgsql-for-all-in-one-dynamic-query) pregunta si lo desea. Gracias – slevin

1

EXECUTE funcionarán solo en el entorno pl/pqsql.

en lugar de tratar con SELECT EXECUTE

SELECT format('SELECT * from result_%s_table', quote_ident((select id from ids where condition = some_condition)) 

salida sería la consulta dinámica.

+0

El texto de la consulta dinámica, seguro, pero no * ejecutará * la consulta. Ver la publicación vinculada anterior. –

+0

sí, he pasado por su detallada ejecución dinámica de qry, aquí lo que mencioné es que EXECUTE funcionará solo en el entorno pl/pqsql, y cuando publiqué mi respuesta realmente no noté su respuesta. – solaimuruganv

+0

Sin preocupaciones. Simplemente no responde la pregunta, que es cómo * ejecutar * SQL dinámico. –

3

Intente utilizar

RETURN QUERY EXECUTE '<SQL Command>' 

Esto devolverá datos en forma de tabla. Tienes que usar esto en la función almacenada de PostgreSQL.

Ya he creado en la demostración completa en el filtro personalizado y la clasificación personalizada mediante la consulta dinámica de PostgreSQL. Por favor, visite la siguiente dirección URL: http://www.dbrnd.com/2015/05/postgresql-dynamic-sql/

0
CREATE OR REPLACE FUNCTION public.exec(
text) 
RETURNS SETOF RECORD 
LANGUAGE 'plpgsql' 
AS $BODY$ 
BEGIN 
    RETURN QUERY EXECUTE $1 ; 
END 
$BODY$; 

uso:

select * from exec('select now()') as t(dt timestamptz) 
Cuestiones relacionadas