PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wywołanie procedury składowanej w ramach procedury składowanej

COPY jest nieco dziwne, ponieważ traktuje swoje query argument jako łańcuch, nawet jeśli nie jest zapisany jako łańcuch. W rezultacie query :

SELECT * FROM retrieve_info($1, $2)

nie jest wykonywany w kontekście funkcji, jest wykonywany w kontekście samej kopii. Nawet jeśli mówisz:

copy (select * from t) ...

jest to traktowane bardziej tak, jakbyś napisał:

copy 'select * from t' ...

więc do czasu wykonania zapytania parametry funkcji nie mają już żadnego znaczenia, query argument do COPY może wyglądać tak, jakby zachowywał się jak zamknięcie w innych językach, ale tak nie jest, działa bardziej jak ciąg, który jest przekazywany do eval .

Możesz obejść tę dziwność, używając zwykłego Kludge of Last Resort:dynamicznego SQL. Lepsze wyniki uzyskasz, jeśli napiszesz swoją funkcję tak, aby używała skręcania łańcuchów i 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sprawdź, czy baza danych istnieje w PostgreSQL za pomocą powłoki

  2. PostgreSQL JOIN z typem tablicy z kolejnością elementów tablicy, jak zaimplementować?

  3. Jak korzystać z przygotowanych wyciągów z Postgresem

  4. PostgreSQL błędna konwersja ze znacznika czasu bez strefy czasowej na znacznik czasu ze strefą czasową

  5. Czy można wyłączyć przetwarzanie ofert w poleceniu Postgres COPY w formacie CSV?