sql >> Databáze >  >> RDS >> PostgreSQL

Volání uložené procedury v rámci uložené procedury

COPY je trochu zvláštní, protože tak nějak zachází se svým query argument jako řetězec, i když není zapsán jako řetězec. Výsledkem je query :

SELECT * FROM retrieve_info($1, $2)

není spuštěn v kontextu funkce, je spuštěn v kontextu samotné COPY. I když říkáte:

copy (select * from t) ...

zachází se s tím spíše, jako byste napsali:

copy 'select * from t' ...

takže v době, kdy je dotaz vykonán, parametry funkce již nemají žádný význam, query argument pro COPY může vypadat, že by se choval jako uzávěr v jiných jazycích, ale nechová se, chová se spíše jako řetězec, který je předán do eval .

Tuto podivnost můžete obejít pomocí obvyklého Kludge of Last Resort:dynamického SQL. Měli byste dosáhnout lepších výsledků, pokud napíšete svou funkci tak, aby používala hádání řetězců a 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. Tabulka chyb Mysql 1050 již existuje, i když ve skutečnosti neexistuje

  2. Jak používat dynamické názvy sloupců v příkazu UPDATE nebo SELECT ve funkci?

  3. Databázové služby na platformě AWS a Oracle Cloud

  4. Top 5 funkcí, které musí vaše platforma pro sledování výkonu databáze SQL Server poskytovat