2012-10-08 16 views
13

Stavo tentando di utilizzare Dynamic SQL per eseguire alcune query in postgres.query sql dinamica in postgres

Esempio:

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

devo interrogare una tabella, che è la forma result_% s_table cui, devo sostituire il nome tabella corretta (un id) da un altro tavolo.

ottengo l'errore ERROR: prepared statement "format" does not exist

Link: string substitution with query result postgresql

risposta

21

EXECUTE ... USING funziona solo in PL/PgSQL - cioè entro funzioni o DO blocks scritti nel linguaggio PL/pgSQL. Non funziona in SQL semplice; il EXECUTE in SQL semplice è completamente diverso, per l'esecuzione di istruzioni preparate. Non è possibile utilizzare l'SQL dinamico direttamente nel dialetto SQL di PostgreSQL.

Confronta:

Vedere la 2 ° ultimo pari in my prior answer.


Oltre a non correre se non in PL/pgSQL l'istruzione SQL è sbagliato, non farà quello che vi aspettate. Se i ritorni (select id from ids where condition = some_condition) indicano 42, l'istruzione non funzionerà se id è un numero intero. Se il testo viene trasmesso, ottieni:

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

Non valido. In realtà vuoi result_42_table o "result_42_table". Dovresti scrivere qualcosa di più simile a:

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

... se è necessario utilizzare quote_ident.

+1

Solo per complemento, un blocco 'DO' restituisce sempre vuoto e accetta nessun parametro quindi penso che il PO è limitato a una funzione. –

+1

@Clodoaldo Buon punto: possono eseguire il comando 'SELECT', ma non gli serviranno a nulla a meno che non debbano fare qualcosa di veramente tondo come" SELECT ... INTO' a una tabella temporanea. –

+1

@CraigRinger Ciao, so che sono un po 'in ritardo per la festa, ma puoi suggerirti qualche buon tutorial per SQL dinamico in postgreSQL? Non riesco a trovarne. Voglio creare una query dinamica all-in-one. Consulta [questo] (https://stackoverflow.com/questions/48216935/pl-pgsql-for-all-in-one-dynamic-query) domanda se vuoi. Grazie – slevin

1

EXECUTE funzionerà solo su ambiente pl/pqsql.

invece di EXECUTE provare con SELECT

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

uscita sarebbe la query dinamica.

+0

Il testo della query dinamica, certo, ma non * eseguirà * la query. Vedi post precedente collegato. –

+0

sì, ho eseguito un'esecuzione dinamica dettagliata di qry, qui solo quello che ho menzionato è EXECUTE funzionerà solo in ambiente pl/pqsql, e quando ho postato la mia risposta non ho notato la tua risposta. – solaimuruganv

+0

Nessun problema. Semplicemente non risponde alla domanda, che è come eseguire * SQL dinamico. –

3

Provare a utilizzare

RETURN QUERY EXECUTE '<SQL Command>' 

Ciò restituirà i dati in forma di tabella. Devi usare questo in una funzione memorizzata di PostgreSQL.

Ho già creato una dimostrazione completa sul filtro personalizzato e sull'ordinamento personalizzato utilizzando la query dinamica di PostgreSQL. Si prega di visitare questo 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$; 

utilizzo:

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