2011-02-04 11 views

Respuesta

14

Necesita construir una cadena, concatenar en el nombre de la tabla dinámica, y luego ejecutar. Tenga en cuenta que escapa del 'por' '. Esto también incluye un nombre dinámico para guardar el archivo también. Necesita reemplazar savedir con el directorio real que está utilizando.

CREATE OR REPLACE FUNCTION dynamicCopy(tablename text, outname text) RETURNS VOID AS $$ 

DECLARE STATEMENT TEXT; 

BEGIN 

    STATEMENT := 'COPY (select * from ' || quote_ident(tablename) || ') to ''savedir' || outname ||'.txt'''; 

    EXECUTE STATEMENT; 

END; 

$$ LANGUAGE 'plpgsql'; 

EDIT:

Desde que escribí primero esto, he descubierto la función de formato, que creo que es generalmente más fácil de leer que SQL generado con el operador de concatenación || y más flexible.

CREATE OR REPLACE FUNCTION dynamicCopy(tablename text, outname text) RETURNS VOID AS 
$BODY$ 
BEGIN 
    EXECUTE FORMAT('COPY (SELECT * FROM %s) TO ''savedir%s.csv''', 
        tablename, 
        outname); 
END 
$BODY$ 
LANGUAGE plpgsql; 

Consulte los documentos oficiales para una discusión completa: https://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

+3

Su ejemplo de código demuestra en realidad un nombre de archivo generado dinámicamente en lugar de un nombre-tabla generado dinámicamente. Además, no menciona que su código de ejemplo especifica salida delimitada por comas, en lugar de la salida predeterminada delimitada por tabuladores. (¿Copió su código de ejemplo desde otro lugar?) – ruakh

+0

Ruakh, gracias por señalar el error. Ahora editado con el nombre de la tabla dyanmica y el nombre del archivo. Sí, es una versión muy simplificada de algo que uso en el trabajo; tendré más cuidado en el futuro para responder la pregunta correctamente. –

+0

Jesucristo, ¡me llevó algo de tiempo descubrir el error tipográfico en quot_ident! ¡Es verdad! Ahora bien, este tiene sentido: "pg_execute(): consulta fallida: ERROR: 42883: la función quot_ident (texto) no existe" – zapadlo

Cuestiones relacionadas