sql >> Databasteknik >  >> RDS >> PostgreSQL

Anropa en lagrad procedur inom en lagrad procedur

COPY är lite udda eftersom den behandlar dess query argument som en sträng även om det inte är skrivet som en sträng. Resultatet är att query :

SELECT * FROM retrieve_info($1, $2)

exekveras inte i kontexten av funktionen, den exekveras i kontexten av själva COPY. Även om du säger:

copy (select * from t) ...

det behandlas mer som om du skrev:

copy 'select * from t' ...

så när frågan exekveras har funktionsparametrarna inte längre någon betydelse, query argument till COPY kan se ut som om det skulle bete sig som en stängning på andra språk, men det gör det inte, det fungerar mer som en sträng som skickas till eval .

Du kan komma runt denna konstighet genom att använda den vanliga Kludge of Last Resort:dynamisk SQL. Du borde få bättre resultat om du skriver din funktion så att den använder strängbråk och 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;


  1. TABLOCK vs TABLOCKX

  2. Trimma efterföljande utrymmen med PostgreSQL

  3. Inom en triggerfunktion, hur man får fram vilka fält som uppdateras

  4. Steg för steg uppgraderingsprocess för R12.2 Upgrade Part -1