函數腳本寫得多了,再想統計整理用到的表信息十分麻煩。甚至存在歷史數據表不再使用的情況,所以需要根據條件對函數引用表信息進行統計。本篇介紹我常用的腳本。
1. 查找某數據表在哪些函數中引用過
select proname from pg_proc where prosrc like '%rpt_user_info%';
2. 查找某數據表在某模式下的哪些函數中引用過
select proname from
pg_proc proc,
pg_namespace spaces
where
proc.pronamespace = spaces.oid
and spaces.nspname = 'anrpt'
and proc.prosrc like '%anrpt.rpt_user_info%';
3. 查詢某模式下的所有表在某模式下的所有函數中的使用情況(通過函數實現)
3.1 建結果表
-- 函數引用表信息
DROP TABLE IF EXISTS anrpt.stat_table_info;
CREATE table anrpt.stat_table_info(
table_nspname varchar(20), --表模式
pro_nspname varchar(20), --函數模式
tablename varchar(50), --表名
proname varchar(200) --函數名
) DISTRIBUTED BY (proname)
3.2 編寫函數
CREATE OR REPLACE FUNCTION "anrpt"."p_stat_table_info"(IN v_table_nspname varchar,IN v_pro_nspname varchar, OUT v_retcode varchar, OUT v_retinfo varchar)
RETURNS "pg_catalog"."record" AS $BODY$
/**
函數說明:根據傳入的需要查詢的表所在模式和函數模式,輸出函數所引用模式下所有表名信息
調用方法:
SELECT anrpt.p_stat_table_info('dim','anrpt');
結果檢查:
SELECT * FROM anrpt.stat_table_info where table_nspname = 'dim' and pro_nspname = 'anrpt' ORDER BY tablename ;
**/
DECLARE
v_sql text;
v_relname varchar(200);
BEGIN
delete from anrpt.stat_table_info where table_nspname = v_table_nspname and pro_nspname = v_pro_nspname;
for v_relname in SELECT aa.relname FROM pg_class aa LEFT JOIN pg_namespace dd ON dd.oid = aa.relnamespace WHERE dd.nspname = v_table_nspname loop
v_sql := '
insert into anrpt.stat_table_info
SELECT
'''||v_table_nspname||''',spaces.nspname,'''||v_relname||''',proc.proname
FROM
pg_proc proc,
pg_namespace spaces
WHERE
proc.pronamespace = spaces.oid
AND spaces.nspname = '''||v_pro_nspname||'''
AND proc.prosrc LIKE ''%'||v_table_nspname||'.'||v_relname||' %''
';
---- 注意百分號前有空格,防止相同表名前綴造成關聯多餘數據,如函數中使用dim_user_info,dim模式下同樣有dim_user表也會被查到!
raise notice 'v_sql is %',v_sql;
EXECUTE v_sql ;
end loop;
V_RETCODE := 'SUCCESS';
V_RETINFO := '結束';
EXCEPTION
WHEN OTHERS THEN
V_RETCODE := 'FAIL';
V_RETINFO := SQLERRM;
END
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
大功告成!