sql >> Database >  >> RDS >> PostgreSQL

Een opgeslagen procedure aanroepen binnen een opgeslagen procedure

COPY is een beetje vreemd omdat het zijn query behandelt argument als een tekenreeks, ook al is het niet als een tekenreeks geschreven. Het resultaat is dat de query :

SELECT * FROM retrieve_info($1, $2)

wordt niet uitgevoerd in de context van de functie, het wordt uitgevoerd in de context van COPY zelf. Ook al zeg je:

copy (select * from t) ...

het wordt meer behandeld alsof je schreef:

copy 'select * from t' ...

dus tegen de tijd dat de query wordt uitgevoerd, hebben de functieparameters geen betekenis meer, de query argument voor COPY lijkt misschien alsof het zich in andere talen als een afsluiting zou gedragen, maar dat is niet zo, het gedraagt ​​​​zich meer als een tekenreeks die wordt doorgegeven aan eval .

Je kunt deze vreemdheid omzeilen door de gebruikelijke Kludge of Last Resort te gebruiken:dynamische SQL. U zou betere resultaten moeten krijgen als u uw functie schrijft om string wrangling te gebruiken en UITVOEREN:

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. Microsoft SQL Server 2005/2008:gegevenstype XML versus tekst/varchar

  2. AMD EPYC 7002-serie processors en SQL Server

  3. Query-optimalisatietechnieken in SQL Server:5 best practices om de prestaties van query's te verbeteren

  4. MySQL *.sql-bestanden uitvoeren in PHP