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

Fungsi dengan jumlah variabel parameter input

Fitur lanjutan seperti VARIADIC atau bahkan tipe input polimorfik dan SQL dinamis sangat kuat. Bab terakhir dalam jawaban ini memberikan contoh lanjutan:

  • Memfaktorkan ulang fungsi PL/pgSQL untuk mengembalikan output dari berbagai kueri SELECT

Tetapi untuk kasus sederhana seperti milik Anda, Anda cukup menggunakan nilai default untuk parameter fungsi. Itu semua tergantung pada persyaratan yang tepat.
Jika kolom yang dimaksud semuanya didefinisikan NOT NULL , ini mungkin akan lebih sederhana dan lebih cepat:

CREATE OR REPLACE FUNCTION update_site(_name      text    -- always required
                                     , _city      text    DEFAULT NULL
                                     , _telephone integer DEFAULT NULL)
  RETURNS integer AS
$func$
BEGIN
   IF _city IS NULL AND _telephone IS NULL THEN
      RAISE WARNING 'At least one value to update required!';
      RETURN;  -- nothing to update
   END IF;

   UPDATE "Sites"
   SET    "City"      = COALESCE(_city, "City")
        , "Telephone" = COALESCE(_telephone, "Telephone")
   WHERE  "SiteName"  = _name;
END
$func$  LANGUAGE plpgsql;

Baca tentang nilai default di manual!

Untuk menghindari konflik penamaan antara parameter dan nama kolom, saya biasa menggunakan awalan parameter input dengan _ . Itu masalah selera dan gaya.

  • Parameter pertama name tidak memiliki default, karena diperlukan setiap saat.
  • Parameter lain dapat dihilangkan.
  • Setidaknya satu diperlukan, atau WARNING dibangkitkan dan tidak ada lagi yang terjadi.
  • UPDATE hanya akan mengubah kolom untuk parameter yang diberikan.
  • Dapat dengan mudah diperluas untuk N parameter.

Panggilan fungsi

Sejak Postgres 9.5 :

Cara sederhananya adalah dengan notasi posisi untuk parameter. Ini hanya memungkinkan untuk menghilangkan parameter paling kanan:

SELECT update_site('foo', 'New York');  -- no telephone

Notasi bernama memungkinkan untuk menghilangkan apa saja parameter yang memiliki nilai default:

SELECT update_site(name => 'foo', _telephone => 123);  -- no city

Keduanya dapat digabungkan dalam notasi campuran :

SELECT update_site('foo', _telephone => 123);  -- still no city

Di Postgres 9.4 atau lebih lama, := digunakan untuk tugas dalam panggilan:

SELECT update_site(name := 'foo', _telephone := 123);
SELECT update_site('foo', _telephone := 123);

Masih valid di Postgres 12 untuk kompatibilitas mundur, melainkan menggunakan notasi modern.



  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 GABUNG dengan tipe array dengan urutan elemen array, bagaimana cara mengimplementasikannya?

  2. Saya terus mendapatkan hubungan kesalahan [TABLE] tidak ada

  3. Tidak dapat terhubung ke Postgres melalui PHP tetapi dapat terhubung dari baris perintah dan PgAdmin di mesin yang berbeda

  4. Postgresql - tidak dapat menjatuhkan basis data karena beberapa koneksi otomatis ke DB

  5. Berapa jumlah maksimum kolom dalam kueri pemilihan PostgreSQL?