PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Извикване на съхранена процедура в рамките на съхранена процедура

COPY е малко странно, тъй като третира query аргумент като низ, въпреки че не е написан като низ. Резултатът е, че query :

SELECT * FROM retrieve_info($1, $2)

не се изпълнява в контекста на функцията, изпълнява се в контекста на самото COPY. Въпреки че казвате:

copy (select * from t) ...

третира се по-скоро като че ли си написал:

copy 'select * from t' ...

така че по времето, когато заявката се изпълни, параметрите на функцията вече нямат никакво значение, query аргументът към COPY може да изглежда така, сякаш би се държал като затваряне на други езици, но не е, той действа по-скоро като низ, който се предава на eval .

Можете да заобиколите тази странност, като използвате обичайния Kludge of Last Resort:динамичен SQL. Трябва да получите по-добри резултати, ако напишете функцията си да използва спорове на низове и ИЗПЪЛНИТЕ:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да пишем с главни букви първата буква на всяка дума в PostgreSQL

  2. Намерете родител рекурсивно с помощта на заявка

  3. Вмъкнете изображение в базата данни на postgresql

  4. PostgreSQL параметризиран Order By / Limit във функцията на таблицата

  5. Преглед на методите JOIN в PostgreSQL