sql >> Base de Datos >  >> RDS >> PostgreSQL

Llamar a un procedimiento almacenado dentro de un procedimiento almacenado

COPY es un poco extraño ya que trata su query argumento como una cadena aunque no esté escrito como una cadena. El resultado es que la query :

SELECT * FROM retrieve_info($1, $2)

no se ejecuta en el contexto de la función, se ejecuta en el contexto de COPY en sí. Aunque digas:

copy (select * from t) ...

se trata más como si hubieras escrito:

copy 'select * from t' ...

entonces, cuando se ejecuta la consulta, los parámetros de la función ya no tienen ningún significado, la query El argumento de COPY puede parecer que se comportaría como un cierre en otros idiomas, pero no es así, actúa más como una cadena que se pasa a eval .

Puede sortear esta extrañeza utilizando el habitual Kludge of Last Resort:SQL dinámico. Debería obtener mejores resultados si escribe su función para usar la disputa de cadenas y EJECUTAR:

create or replace function print_out(text, text) returns void as $$
begin
    execute 'copy ('
         || 'select * from retrieve_info'
         ||     '(' || quote_literal($1) || ',' || quote_literal($2) || ')'
         || ') to ''myfilepath/test.csv'' with csv header;';
end;
$$ language plpgsql;