PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Chamando um procedimento armazenado dentro de um procedimento armazenado


COPY é um pouco estranho, pois trata sua query argumento como uma string mesmo que não seja escrito como uma string. O resultado é que a query :
SELECT * FROM retrieve_info($1, $2)

não é executado no contexto da função, é executado no contexto da própria COPY. Mesmo que você diga:
copy (select * from t) ...

é tratado mais como se você escrevesse:
copy 'select * from t' ...

então, no momento em que a consulta é executada, os parâmetros da função não têm mais significado, a query argumento para COPY pode parecer que se comportaria como um encerramento em outras linguagens, mas não funciona, ele age mais como uma string que é passada para eval .

Você pode contornar essa estranheza usando o habitual Kludge of Last Resort:SQL dinâmico. Você deve obter melhores resultados se escrever sua função para usar string wrangling e EXECUTE:
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;