1. 程式人生 > >【gp資料庫】查詢函式中引用資料表資訊

【gp資料庫】查詢函式中引用資料表資訊

函式指令碼寫得多了,再想統計整理用到的表資訊十分麻煩。甚至存在歷史資料表不再使用的情況,所以需要根據條件對函式引用表資訊進行統計。本篇介紹我常用的指令碼。

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;

大功告成!

上一篇:【gp資料庫】你一定會用到的運維語句寶典

下一篇:【gp資料庫】查詢模式下所有函式名稱(附帶引數資訊)