ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

【数据库】PostgreSQL/PgSql-根据模式名和字段名查询有该字段的所有表信息【通过表元数据信息和函数实现】

2022-08-23 15:04:33  阅读:255  来源: 互联网

标签:index PostgreSQL integer list PgSql table 表元 loop schema


一、利用表数据信息查询表和字段信息

(一)从pg_tables中查询表信息

select 
    tablename
from pg_tables
where 
    schemaname='ap'
and
    tablename SIMILAR TO 'dwd_[a-z,_]+_[0-9]+'

(二)从pg_class和pg_attribute根据指定的表名查询字段信息

SELECT 
	C.relname,
	A.attname AS NAME,
	A.attnotnull AS NOTNULL,
	format_type ( A.atttypid, A.atttypmod ) AS TYPE,
	col_description ( A.attrelid, A.attnum ) AS COMMENT 
FROM
	pg_class AS C,
	pg_attribute AS A 
WHERE
	C.relname = 'table_name' 
	AND A.attrelid = C.oid 
	AND A.attnum > 0

二、函数创建步骤

(一)创建函数

CREATE OR REPLACE FUNCTION ods.find_table_by_column_and_schema()
RETURNS "pg_catalog"."void" AS $BODY$
DECLARE
    loop_index integer;
BEGIN
    loop_index=1;
END;
$BODY$
    LANGUAGE plpgsql VOLATILE
    COST 100

(二)函数调用

select ods.find_table_by_column_and_schema(10);

(三) 输入参数

CREATE OR REPLACE FUNCTION ods.find_table_by_column_and_schema(in_param_schema integer)
RETURNS "pg_catalog"."void" AS $BODY$
DECLARE
    loop_index integer;
BEGIN
    loop_index=1;
    loop_index=loop_index+in_param_schema;
    RAISE notice '表名为:%',loop_index;
END;
$BODY$
    LANGUAGE plpgsql VOLATILE
    COST 100

(四)删除已创建的函数

DROP FUNCTION find_table_by_column_and_schema(integer)

(五)输出及打印参数

CREATE OR REPLACE FUNCTION ods.find_table_by_column_and_schema(
    in_param_schema integer,
    OUT out_table_list integer)
RETURNS integer AS $BODY$
DECLARE
    loop_index integer;
BEGIN
    loop_index=1;
    loop_index=loop_index+in_param_schema;
    RAISE notice '表名为:%',loop_index;
    out_table_list=loop_index;
END;
$BODY$
    LANGUAGE plpgsql VOLATILE
    COST 100

(六)测试数组

CREATE OR REPLACE FUNCTION ods.find_table_by_column_and_schema(
    in_param_schema integer,
    OUT out_table_list character varying[])
RETURNS character varying[] AS $BODY$
DECLARE
    loop_index integer;
BEGIN
    loop_index=1;
    loop_index=loop_index+in_param_schema;
    RAISE notice '表名为:%',loop_index;
    out_table_list[0]=loop_index;
    out_table_list[1]=loop_index+1;
    out_table_list[2]=concat(out_table_list[1],cast(1 as character varying));
END;
$BODY$
    LANGUAGE plpgsql VOLATILE
    COST 100

问题:character varying[]和character、varchar的区别

(七)测试与SQL交互

CREATE OR REPLACE FUNCTION ods.find_table_by_column_and_schema(
    in_param_schema integer,
    OUT out_table_list character varying[])
RETURNS character varying[] AS $BODY$
DECLARE
    loop_index integer;
BEGIN
    loop_index=1;
    loop_index=loop_index+in_param_schema;
    RAISE notice '表名为:%',loop_index;
    out_table_list[0]=loop_index;
    out_table_list[1]=loop_index+1;
    out_table_list[2]=(
        select count(*) from ap.fact_ito
    );
END;
$BODY$
    LANGUAGE plpgsql VOLATILE
    COST 100

三、最终结果

(一)函数内容

CREATE OR REPLACE FUNCTION ods.find_table_by_column_and_schema(
	in_param_schema varchar,
	in_param_column varchar,
	OUT out_table_list character varying[])
RETURNS character varying[]
LANGUAGE 'plpgsql'
COST 100
VOLATILE 
AS $BODY$
DECLARE
	loop_index integer;
	row_record VARCHAR(200); 
	arr_length integer;
BEGIN
	loop_index = 1;
	FOR row_record IN(
		select 
		tablename
	from pg_tables
	where 
		schemaname=in_param_schema
	) LOOP 
		IF (SELECT count(*)
				FROM (SELECT 
					C.relname,
					A.attname AS column_name,
					A.attnotnull AS NOTNULL,
					format_type ( A.atttypid, A.atttypmod ) AS TYPE,
					col_description ( A.attrelid, A.attnum ) AS COMMENT 
				FROM
					pg_class AS C,
					pg_attribute AS A 
				WHERE
					C.relname = row_record
					AND A.attrelid = C.oid 
					AND A.attnum > 0
				) REF
				where column_name=in_param_column)>0
		THEN
			out_table_list[loop_index]=row_record;
				loop_index=loop_index+1;
		END IF;
	END LOOP;
END;
$BODY$;

(二)调用方式

select ods.find_table_by_column_and_schema('ods','fbillno');

 

标签:index,PostgreSQL,integer,list,PgSql,table,表元,loop,schema
来源: https://www.cnblogs.com/liujinhui/p/16616165.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有