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

Tambahkan kolom secara dinamis dengan beberapa nilai ke tabel apa pun menggunakan fungsi PL/pgSQL

Saya melakukan ini dengan refcursor jika Anda ingin daftar kolom keluaran sepenuhnya dinamis:

CREATE OR REPLACE FUNCTION is_record_exists(tablename character varying, columns character varying[], keepcolumns character varying[] DEFAULT NULL::character varying[])
    RETURNS SETOF refcursor AS
$BODY$

DECLARE 
    ref refcursor;
    keepColumnsList text;
    columnsList text; 
    valuesList text;
    existQuery text;
    keepQuery text;
BEGIN
    IF keepcolumns IS NOT NULL AND array_length(keepColumns, 1) > 0 THEN
        keepColumnsList :=  array_to_string(keepColumns, ', ');
    ELSE
        keepColumnsList :=  'COUNT(*)';
    END IF;

    columnsList := (SELECT array_to_string(array_agg(name || ' = ' || value), ' OR ') FROM
        (SELECT unnest(columns[1:1]) AS name, unnest(columns[2:2]) AS value) pair);

    existQuery := 'SELECT ' || keepColumnsList || ' FROM ' || tableName || ' WHERE ' || columnsList;
    RAISE NOTICE 'Exist query: %', existQuery;

    OPEN ref FOR EXECUTE
        existQuery;
    RETURN next ref;
END;$BODY$
  LANGUAGE plpgsql;

Maka perlu memanggil FETCH ALL IN untuk mendapatkan hasil. Sintaks detail di sini atau di sana:https://stackoverflow.com/a/12483222/630169 . Sepertinya itu satu-satunya cara untuk saat ini. Berharap sesuatu akan berubah di PostgreSQL 11 dengan PROSEDUR.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa yang Harus Diperhatikan jika Replikasi PostgreSQL Anda Lagging

  2. Peningkatan otomatis PostgreSQL meningkat pada setiap pembaruan

  3. PostgreSQL:FATAL - Otentikasi rekan gagal untuk pengguna (PG::ConnectionBad)

  4. Kumpulan koneksi Jboss AS7 tidak akan terhubung kembali

  5. IntegrityError saat menyimpan item baru ke db postgresql di Django?