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

Cara mendapatkan daftar parameter fungsi (sehingga saya bisa menjatuhkan fungsi)

Postgres memiliki fungsi khusus untuk tujuan itu. Diperkenalkan dengan Postgres 8.4. Panduan:

pg_get_function_identity_arguments(func_oid) ... dapatkan daftar argumen untuk mengidentifikasi fungsi (tanpa nilai default) ...

pg_get_function_identity_arguments mengembalikan daftar argumen yang diperlukan untuk mengidentifikasi suatu fungsi, dalam bentuk yang diperlukan untuk muncul di dalam ALTER FUNCTION , misalnya. Formulir ini menghilangkan nilai default.

Menggunakan itu (dan format() , diperkenalkan dengan Postgres 9.1), kueri berikut menghasilkan pernyataan DDL untuk menghapus fungsi yang cocok dengan istilah pencarian Anda:

SELECT format('DROP %s %I.%I(%s);'
            , CASE WHEN p.proisagg THEN 'AGGREGATE' ELSE 'FUNCTION' END
            , n.nspname
            , p.proname
            , pg_catalog.pg_get_function_identity_arguments(p.oid)
             ) AS stmt
FROM   pg_catalog.pg_proc p
JOIN   pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE  p.proname = 'dblink'                     -- function name
-- AND n.nspname = 'public'                     -- schema name (optional)
-- AND pg_catalog.pg_function_is_visible(p.oid) -- function visible to user
ORDER  BY 1;

Katalog sistem pg_proc diubah di Postgres 11 . proisagg digantikan oleh prokind , prosedur tersimpan yang sebenarnya telah ditambahkan. Anda perlu beradaptasi. Lihat:

  • Bagaimana cara menghapus semua fungsi saya di PostgreSQL?

Pengembalian:

                  stmt
---------------------------------------------------
 DROP FUNCTION public.dblink(text);
 DROP FUNCTION public.dblink(text, boolean);
 DROP FUNCTION public.dblink(text, text);
 DROP FUNCTION public.dblink(text, text, boolean); 

Ditemukan empat kecocokan dalam contoh karena dblink menggunakan fungsi kelebihan beban.
Jalankan DROP pernyataan secara selektif!

Alternatif , Anda dapat menggunakan pemeran yang nyaman untuk jenis pengenal objek regprocedure yang mengembalikan tanda tangan fungsi lengkap termasuk tipe argumen:

-- SET LOCAL search_path = '';  -- optional, to get all names schema-qualified
SELECT format('DROP %s %s;'
            , CASE WHEN proisagg THEN 'AGGREGATE' ELSE 'FUNCTION' END
            , oid::regprocedure
             ) AS stmt
FROM   pg_catalog.pg_proc
WHERE  proname = 'dblink'   -- function name
ORDER  BY 1;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sifat `diesel::Expression` tidak diterapkan untuk `bigdecimal::BigDecimal`

  2. Bagaimana cara memperbaiki kesalahan ketidakcocokan versi pg_dump?

  3. Bagaimana cara memutakhirkan PostgreSQL dari versi 9.6 ke versi 10.1 tanpa kehilangan data?

  4. Pergi dan IN klausa di Postgres

  5. Pencadangan Inkremental PostgreSQL dan Pemulihan Point-In-Time