【gp資料庫】查詢函式中引用資料表資訊
阿新 • • 發佈:2018-11-28
函式指令碼寫得多了,再想統計整理用到的表資訊十分麻煩。甚至存在歷史資料表不再使用的情況,所以需要根據條件對函式引用表資訊進行統計。本篇介紹我常用的指令碼。
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;
大功告成!