query sql dynamic in postgres

Stavo tentando di utilizzare Dynamic SQL per eseguire alcune query 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 è della forma result_% s_table in cui, ho bisogno di sostituire il nome della tabella corretta (un id) da un’altra tabella.

Ottengo l’errore ERROR: prepared statement "format" does not exist

Link: sostituzione delle stringhe con risultato della query postgresql

EXECUTE ... USING funziona solo in PL / PgSQL – cioè all’interno di funzioni o blocchi DO scritti in linguaggio PL / PgSQL. Non funziona in SQL semplice; l’ EXECUTE in semplice SQL è completamente diverso, per l’esecuzione di istruzioni preparate. Non è ansible utilizzare l’SQL dinamico direttamente nel dialetto SQL di PostgreSQL.

Confrontare:

  • PL / PgSQL’s EXECUTE ... USING ; a
  • SQL EXECUTE

Vedere il 2 ° par finale nella mia risposta precedente .


Oltre a non essere in esecuzione tranne in PL / PgSQL, la tua istruzione SQL è sbagliata, non farà ciò che ti aspetti. Se (select id from ids where condition = some_condition) restituisce dire 42 , l’istruzione fallirebbe se id fosse un intero. Se viene trasmesso in testo, 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'; 

Questo non è valido In realtà vuoi result_42_table o "result_42_table" . Dovresti scrivere qualcosa di più:

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

… se devi usare quote_ident .

Prova a usare

 RETURN QUERY EXECUTE '' 

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 dynamic di PostgreSQL. Si prega di visitare questo URL: http://www.dbrnd.com/2015/05/postgresql-dynamic-sql/

EXECUTE funzionerà solo in ambiente pl / pqsql.

invece di EXECUTE prova con SELECT

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

l’output sarebbe la query dynamic.

 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)