Solución:
Creo que tu problema es el idioma que estás usando. EJECUTAR en el lenguaje SQL:
EXECUTE
se utiliza para ejecutar una declaración previamente preparada. Dado que las declaraciones preparadas solo existen durante la duración de una sesión, la declaración preparada debe haber sido creada por unPREPARE
declaración ejecutada anteriormente en la sesión actual.
no es lo mismo que EXECUTE en PL / pgSQL:
A menudo, querrá generar comandos dinámicos dentro de sus funciones PL / pgSQL, es decir, comandos que involucrarán diferentes tablas o diferentes tipos de datos cada vez que se ejecuten. Los intentos normales de PL / pgSQL de almacenar en caché planes para comandos (como se discutió en la Sección 39.10.2) no funcionarán en tales escenarios. Para manejar este tipo de problema, el
EXECUTE
se proporciona la declaración:EXECUTE command-string [ INTO [STRICT] target ] [ USING expression [, ... ] ];
Está utilizando SQL EXECUTE (que ejecuta una declaración preparada) cuando desea utilizar PL / pgSQL EXECUTE (que ejecuta una cadena como SQL).
Prueba esto:
CREATE OR REPLACE FUNCTION example() RETURNS void AS $$
BEGIN
EXECUTE 'INSERT INTO table1 (col1, col2, col3) SELECT col1, col2, col3 from temp_table';
END;
$$ LANGUAGE PLPGSQL;
O, otro ejemplo que parece más cercano a lo que parece estar tratando de hacer:
create or replace function example(tname text) returns void as $$
begin
execute 'insert into ' || tname || ' (name) values(''pancakes'')';
end;
$$ language plpgsql;
Que insertará 'pancakes'
en la mesa que pasas en el tname
argumento de la función.