Berikut adalah tiga contoh mengembalikan daftar prosedur tersimpan yang mereferensikan tabel tertentu di PostgreSQL.
information_schema.routines
Lihat
Kami dapat menanyakan information_schema.routines
lihat untuk melihat apakah ada definisi yang berisi nama tabel.
Contoh:
SELECT
routine_name,
routine_body,
routine_definition
FROM information_schema.routines
WHERE routine_type = 'PROCEDURE'
AND routine_schema = 'public'
AND routine_definition ILIKE '%artists%';
Dalam contoh ini, saya memeriksa untuk melihat apakah ada prosedur tersimpan yang memiliki teks artists
dalam definisi mereka.
ILIKE
operator membuat kecocokan tidak peka huruf besar/kecil menurut lokal aktif. Ini adalah ekstensi PostgreSQL, dan ini bukan bagian dari standar SQL. Untuk pencocokan peka huruf besar/kecil, gunakan LIKE
.
Perhatikan bahwa itu tidak sempurna, dalam arti bahwa itu bisa mengembalikan positif palsu jika teks ada dalam prosedur, tetapi itu bukan tabel. Untuk mengurangi risiko ini, Anda mungkin dapat memperbaiki kriteria filter.
pg_proc
Katalog
pg_catalog.pg_proc
katalog menyimpan informasi tentang fungsi, prosedur, fungsi agregat, dan fungsi jendela. Oleh karena itu, kita dapat menanyakan seperti ini:
SELECT
n.nspname AS schema_name,
p.proname AS function_name,
pg_get_function_arguments(p.oid) AS arguments,
p.prosrc AS definition
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE p.prokind = 'p'
AND n.nspname = 'public'
AND p.prosrc ILIKE '%artists%';
Dalam hal ini, kami menggabungkan katalog dengan pg_catalog.pg_namespace
katalog untuk memfilter hasil ke hanya prosedur dengan public
ruang nama.
Sebagai alternatif, kita dapat menggunakan pg_get_functiondef()
berfungsi untuk mendapatkan definisi. Fungsi ini sebenarnya merekonstruksi perintah pembuatan untuk prosedur tersimpan. Ini adalah rekonstruksi yang didekompilasi, bukan teks asli dari perintah. Ini menghasilkan CREATE OR REPLACE PROCEDURE
pernyataan untuk prosedur tersimpan.
Contoh:
SELECT
n.nspname AS schema_name,
p.proname AS function_name,
pg_get_function_arguments(p.oid) AS arguments,
pg_get_functiondef(p.oid) AS definition
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE p.prokind = 'p'
AND n.nspname = 'public'
AND p.prosrc ILIKE '%artists%';
Dapatkan Baris Spesifik yang Merujuk Tabel
Kami dapat memodifikasi kueri kami untuk menyertakan nomor baris yang merujuk ke tabel:
SELECT *
FROM (
SELECT
proname AS stored_procedure,
row_number() OVER (partition by proname) AS line_number,
textline
FROM (
SELECT
proname,
unnest(string_to_array(prosrc, chr(10))) AS textline
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE nspname = 'public'
AND prosrc ILIKE '%artists%'
) lines
) x
WHERE textline ILIKE '%artists%';
Contoh ini didasarkan pada jawaban Stack Overflow oleh Klin.