PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Appel d'une procédure stockée dans une procédure stockée

COPY est un peu étrange car il traite en quelque sorte sa query argument sous forme de chaîne même s'il n'est pas écrit en tant que chaîne. Le résultat est que la query :

SELECT * FROM retrieve_info($1, $2)

n'est pas exécuté dans le contexte de la fonction, il est exécuté dans le contexte de COPY lui-même. Même si vous dites :

copy (select * from t) ...

il est davantage traité comme si vous écriviez :

copy 'select * from t' ...

donc au moment où la requête est exécutée, les paramètres de la fonction n'ont plus aucun sens, la query l'argument de COPY peut sembler se comporter comme une fermeture dans d'autres langages mais ce n'est pas le cas, il agit plus comme une chaîne qui est passée à eval .

Vous pouvez contourner cette étrangeté en utilisant l'habituel Kludge of Last Resort :le SQL dynamique. Vous devriez obtenir de meilleurs résultats si vous écrivez votre fonction pour utiliser le string wrangling et 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;