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

Kaldning af en lagret procedure inden for en lagret procedure

COPY er lidt mærkeligt, da det på en måde behandler sin query argument som en streng, selvom det ikke er skrevet som en streng. Resultatet er, at query :

SELECT * FROM retrieve_info($1, $2)

udføres ikke i konteksten af ​​funktionen, den udføres i konteksten af ​​selve COPY. Selvom du siger:

copy (select * from t) ...

det behandles mere som om du skrev:

copy 'select * from t' ...

så når forespørgslen udføres, har funktionsparametrene ikke længere nogen betydning, query argumentet til COPY kan se ud som om det ville opføre sig som en lukning på andre sprog, men det gør det ikke, det fungerer mere som en streng, der sendes til eval .

Du kan komme uden om denne mærkelighed ved at bruge den sædvanlige Kludge of Last Resort:dynamisk SQL. Du burde få bedre resultater, hvis du skriver din funktion til at bruge string wrangling og 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. Relationelle vs ikke-relationelle databaser – Del 2

  2. 2 måder at slette duplikerede rækker i Oracle

  3. Deadlocks i PostgreSQL, når du kører UPDATE

  4. SQL Server Error 206:Operand type sammenstød