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
.
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. –
@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. –
@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