Tubuh fungsi hanya disimpan sebagai string . Tidak ada daftar objek yang direferensikan. (Itu berbeda dari tampilan, misalnya, di mana tautan sebenarnya ke tabel referensi disimpan.)
Permintaan untuk Postgres 10 atau lebih lama ini menggunakan fungsi informasi katalog sistempg_get_functiondef()
untuk merekonstruksi CREATE FUNCTION
skrip untuk fungsi-fungsi yang relevan dan mencari nama tabel dengan ekspresi reguler yang tidak peka huruf besar-kecil:
SELECT n.nspname AS schema_name
, p.proname AS function_name
, pg_get_function_arguments(p.oid) AS args
, pg_get_functiondef(p.oid) AS func_def
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE NOT p.proisagg
AND n.nspname NOT LIKE 'pg_%'
AND n.nspname <> 'information_schema'
AND pg_get_functiondef(p.oid) ~* '\mbig\M';
Seharusnya melakukan pekerjaan, tetapi jelas tidak tahan peluru. Ini bisa gagal untuk SQL dinamis di mana nama tabel dihasilkan secara dinamis dan dapat mengembalikan sejumlah positif palsu - terutama jika nama tabel adalah kata yang umum.
Fungsi agregat dan semua fungsi dari skema sistem dikecualikan.
\m
dan\M
tandai awal dan akhir kata dalam ekspresi reguler.
Katalog sistem pg_proc
diubah dalam Postgres 11. proisagg
digantikan oleh prokind
, prosedur tersimpan yang sebenarnya ditambahkan. Anda perlu beradaptasi. Terkait:
EXECUTE
ekspresi seperti'mm_'||name_parameter
, dan itu tidak akan mengatasi dengan benar dengan nama-nama yang dikutip seperti"my""table""
atau dengan case-folding, tetapi itu akan melakukan sebagian besar apa yang diinginkan kebanyakan orang .