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

Argumen opsional dalam fungsi PL/pgSQL

Sejak PostgreSQL 8.4 (yang tampaknya Anda jalankan), ada nilai default untuk parameter fungsi . Jika Anda menempatkan parameter terakhir dan memberikan default, Anda dapat dengan mudah menghilangkannya dari panggilan:

CREATE OR REPLACE FUNCTION foofunc(_param1 integer
                                 , _param2 date
                                 , _ids    int[] DEFAULT '{}')
  RETURNS SETOF foobar         -- declare return type!
  LANGUAGE plpgsql AS
$func$
BEGIN  -- required for plpgsql
   IF _ids <> '{}'::int[] THEN  -- exclude empty array and NULL
      RETURN QUERY
      SELECT *
      FROM   foobar
      WHERE  f1 = _param1
      AND    f2 = _param2
      AND    id = ANY(_ids);    -- "IN" is not proper syntax for arrays
   ELSE
      RETURN QUERY
      SELECT *
      FROM   foobar
      WHERE  f1 = _param1
      AND    f2 = _param2;
   END IF;
END  -- required for plpgsql
$func$;

Poin utama:

  • Kata kunci DEFAULT digunakan untuk mendeklarasikan default parameter. Alternatif singkat:= .

  • Saya menghapus param1 yang berlebihan dari contoh yang berantakan.

  • Karena Anda mengembalikan SELECT * FROM foobar , nyatakan tipe pengembalian sebagai RETURNS SETOF foobar bukannya RETURNS SETOF record . Formulir terakhir dengan catatan anonim sangat berat, Anda harus memberikan daftar definisi kolom dengan setiap panggilan.

  • Saya menggunakan array integer (int[] ) sebagai parameter fungsi. Mengadaptasi IF ekspresi dan WHERE klausa yang sesuai.

  • IF pernyataan tidak tersedia dalam SQL biasa. Harus LANGUAGE plpgsql untuk itu.

Panggilan dengan atau tanpa _ids :

SELECT * FROM foofunc(1, '2012-1-1'::date);

Secara efektif sama:

SELECT * FROM foofunc(1, '2012-1-1'::date, '{}'::int[]);

Anda harus memastikan bahwa panggilan tersebut tidak ambigu. Jika Anda memiliki fungsi lain dengan nama dan dua parameter yang sama, Postgres mungkin tidak tahu mana yang harus dipilih. Pengecoran eksplisit (seperti yang saya tunjukkan) mempersempitnya. Selain itu, literal string yang tidak diketik juga berfungsi, tetapi menjadi eksplisit tidak ada salahnya.

Panggilan dari dalam fungsi lain:

CREATE FUNCTION foofuncwrapper(_param1 integer, _param2 date)
  RETURNS SETOF foobar
  LANGUAGE plgpsql AS
$func$
DECLARE
   _ids int[] := '{1,2,3}';
BEGIN
   -- whatever

   RETURN QUERY
   SELECT * FROM foofunc(_param1, _param2, _ids);
END
$func$;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lakukan kueri jam operasi ini di PostgreSQL

  2. PG::Error:SELECT DISTINCT, ORDER BY ekspresi harus muncul di daftar pilih

  3. Cara bersih untuk menggunakan fungsi jendela postgresql di Django ORM?

  4. MAX() Fungsi di PostgreSQL

  5. Bagaimana cara mengubah nilai default kolom di PostgreSQL?