PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Aufrufen einer gespeicherten Prozedur innerhalb einer gespeicherten Prozedur

COPY ist etwas seltsam, da es seine query behandelt Argument als String, obwohl es nicht als String geschrieben ist. Das Ergebnis ist die query :

SELECT * FROM retrieve_info($1, $2)

wird nicht im Kontext der Funktion ausgeführt, sondern im Kontext von COPY selbst. Auch wenn Sie sagen:

copy (select * from t) ...

es wird eher so behandelt, als ob Sie geschrieben hätten:

copy 'select * from t' ...

also bis die Abfrage ausgeführt wird, haben die Funktionsparameter keine Bedeutung mehr, die query Das Argument für COPY sieht vielleicht so aus, als würde es sich in anderen Sprachen wie eine Closure verhalten, tut es aber nicht, es verhält sich eher wie ein String, der an eval übergeben wird .

Sie können diese Seltsamkeit umgehen, indem Sie das übliche Kludge of Last Resort verwenden:dynamisches SQL. Sie sollten bessere Ergebnisse erzielen, wenn Sie Ihre Funktion so schreiben, dass sie String-Wrangling und EXECUTE:

verwendet
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;