PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Memanggil prosedur tersimpan dalam prosedur tersimpan

COPY agak aneh karena memperlakukan query its argumen sebagai string meskipun tidak ditulis sebagai string. Hasilnya adalah query :

SELECT * FROM retrieve_info($1, $2)

tidak dieksekusi dalam konteks fungsi, itu dijalankan dalam konteks SALIN itu sendiri. Meskipun Anda mengatakan:

copy (select * from t) ...

itu diperlakukan lebih seperti Anda menulis:

copy 'select * from t' ...

jadi pada saat kueri dijalankan, parameter fungsi tidak lagi memiliki arti, query argumen ke COPY mungkin terlihat seperti akan berperilaku seperti penutupan dalam bahasa lain tetapi tidak, ia bertindak lebih seperti string yang diteruskan ke eval .

Anda dapat mengatasi keanehan ini dengan menggunakan Kludge of Last Resort yang biasa:SQL dinamis. Anda akan mendapatkan hasil yang lebih baik jika Anda menulis fungsi Anda untuk menggunakan string wrangling dan 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. Kunci penasihat atau SEKARANG untuk menghindari menunggu baris yang terkunci?

  2. Bagaimana cara membandingkan baris saat ini dengan baris berikutnya dan sebelumnya di PostgreSQL?

  3. PostgreSQL:menjalankan hitungan baris untuk kueri 'menurut menit'

  4. Cara Menghitung Perbedaan Antara Dua Timestamp di PostgreSQL

  5. Cara Mengidentifikasi Masalah Kinerja PostgreSQL dengan Kueri Lambat