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

Struktur kontrol PL/pgSQL untuk daftar/array

CREATE OR REPLACE FUNCTION CREATE_PAYMENT(p_amount_list numeric[])
  RETURNS numeric AS
$func$
DECLARE
   s_chk_amnt numeric := 0; -- init variable!
   r          numeric;
BEGIN
-- IF p_amount_list <> '{}' THEN  -- just noise
   FOREACH r IN ARRAY p_amount_list
   LOOP
      s_chk_amnt := s_chk_amnt + r;
   END LOOP;
-- END IF;

RETURN s_chk_amnt;
END
$func$ LANGUAGE plpgsql

Poin utama

  • number Oracle adalah numeric di Postgres . Tetapi jika Anda tidak memiliki angka pecahan, Anda lebih suka menggunakan int atau bigint di Postgres. Tentang pemetaan tipe antara Oracle dan Postgres.

  • Postgres tidak memiliki "tipe tabel" seperti Oracle . Gunakan jenis array , larik numeric dalam hal ini:numeric[] .

  • Ekspresi IF p_amount_list <> '{}' ... akan mengesampingkan NULL dan "array kosong" sama. Tidak perlu pemeriksaan kedua seperti pada aslinya. Tapi IF tidak diperlukan sama sekali. Untuk NULL atau array kosong, loop tetap tidak dimasukkan.

  • r memegang elemen itu sendiri, bukan indeks untuk itu. (Oleh karena itu harus menjadi tipe data yang cocok.)

Ini menunjukkan sintaks dasar dari FOREACH loop dalam fungsi plpgsql. Kalau tidak, itu akan menjadi omong kosong yang mahal , lebih baik diganti dengan yang lebih sederhana dan lebih cepat:

SELECT sum(elem) AS sum_amount
FROM   unnest(p_amount_list) elem;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menerapkan hubungan banyak ke banyak di PostgreSQL?

  2. Pemicu sisipan Postgresql untuk digabungkan

  3. PostgreSQL:peran tidak diizinkan untuk masuk

  4. SQL Query untuk Transpose Jumlah Kolom ke Jumlah Baris

  5. Apakah fungsi XPath sum atau fn:sum diimplementasikan di PostgreSQL XPath?