PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Chiamata di una procedura memorizzata all'interno di una procedura memorizzata

COPY è un po' strano in quanto tratta la sua query argomento come una stringa anche se non è scritto come una stringa. Il risultato è che la query :

SELECT * FROM retrieve_info($1, $2)

non viene eseguito nel contesto della funzione, viene eseguito nel contesto di COPY stesso. Anche se dici:

copy (select * from t) ...

è trattato più come se tu scrivessi:

copy 'select * from t' ...

quindi quando la query viene eseguita, i parametri della funzione non hanno più alcun significato, la query l'argomento in COPY può sembrare che si comporti come una chiusura in altri linguaggi ma non è così, si comporta più come una stringa che viene passata a eval .

Puoi aggirare questa stranezza usando il solito Kludge di Last Resort:SQL dinamico. Dovresti ottenere risultati migliori se scrivi la tua funzione per utilizzare la modifica delle stringhe ed ESEGUI:

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;