Saya menjalankan skrip plpgsql di Postgres 8.3 - Saya ingin meneruskan argumen ke skrip ini melalui psql. Saat ini saya sedang menjalankan skrip seperti:
psql -d database -u user -f update_file.sql
Saya menemukan tautan ini yang menjelaskan variabel lingkungan PGOPTIONS, tetapi itu tidak berfungsi untuk argumen "khusus". yaitu saya menerima kesalahan karena pengaturan tidak tercantum dalam file postgres.conf.
-bash-3.2$ export PGOPTIONS='--pretend=true'
-bash-3.2$ psql -d my_db -f update_database.sql
psql: FATAL: unrecognized configuration parameter "pretend"
Ada ide lain? Idealnya saya ingin menghindari variabel lingkungan ...
postgresql
psql
Jmoney38
sumber
sumber
-v
argumen psql.Jawaban:
Sebenarnya, tidak ada yang namanya "skrip plpgsql" - PL / pgSQL adalah bahasa prosedural default PostgreSQL. Entah itu skrip SQL atau fungsi / prosedur plpgsql. Contoh Anda tampaknya menunjukkan skrip SQL.
Anda bisa membuat fungsi (sisi server) plpgsql (atau sql) sebagai gantinya, yang mengambil sejumlah argumen. Ini sangat sederhana asalkan argumennya
values
. Akan sedikit lebih rumit jika argumen menyertakan pengidentifikasi. Maka Anda harus menggunakan PL / pgSQL dengan SQL dinamis danEXECUTE
.PL / pgSQL sudah diinstal sebelumnya secara default di PostgreSQL 9.0 atau yang lebih baru. Anda harus menginstalnya sekali per basis data di Postgres 8.3, meskipun:
Berbicara tentang versi: Anda harus mempertimbangkan untuk meningkatkan ke versi PostgreSQL saat ini. v8.3 sudah sangat tua sekarang, akhir kehidupan di awal 2013.
Karena Anda tampaknya memiliki skrip SQL yang siap saya akan menunjukkan fungsi SQL. Fungsi dummy sederhana dengan dua argumen integer:
Anda dapat menemukan banyak contoh yang lebih canggih untuk plpgsql di sini di dba.SE atau SO .
Anda dapat memanggil fungsi ini dan menyerahkan parameter dalam skrip shell: Contoh dasar untuk panggilan dalam skrip shell yang menggunakan parameter input untuk parameter integer (tidak ada tanda kutip tunggal di sekitar nilai yang diperlukan):
Atau dengan tipe data apa pun:
-c
mengeksekusi satu string perintah dan kemudian keluar. Lebih lanjut tentang argumen baris perintah psql dalam manual .sumber
Untuk menambahkan fungsionalitas lain untuk
-v
... Jika Anda mencoba menambahkan kutipan, tambahkan di baris perintah:dan ini akan menjalankan kode untuk:
Sama seperti
sumber
Coba
-v
:Jika Anda ingin menggunakan
current_setting
danSET
atausetval
, Anda harus menambahkan barispostgresql.conf
untuk menambahkan opsi.sumber
Dari pengalaman saya, melakukan dereffing variabel psql di dalam deklarasi plpgsql seperti dalam CREATE FUNCTION BEGIN atau DO BEGIN menghasilkan kesalahan sintaksis:
Solusi saya adalah membuat tabel sementara dengan satu kolom dan menyimpan nilai di dalamnya. Tabel sementara ini dapat diakses melalui plpgsql dan dengan demikian saya dapat melewatkan variabel psql yang digunakan dalam blok DO.
Untuk menggunakan variabel psql tambahan dalam CREATE FUNCTION atau DO declaration, Anda dapat membuat kolom per variabel yang diperlukan.
sumber
Ini tidak terlalu elegan tetapi berhasil (pseudocode):
sumber
Pendekatan ini akan memberikan Anda resolusi run-time penuh dari env vars ... sehingga segera setelah skrip Anda mengatur sebelumnya semua variabel shell di bawah ini akan berfungsi ( telah dijalankan ribuan kali melawan berbagai dbs dan host ):
sumber