最近基于postgresSQL的游标和临时表方案开发了一个数据完整率的核查工具。
5 SQL摘要
1、向result_table记录分vendor_name的记录总数
sql := 'insert into '||result_table||' (时间,vendor_name,记录总数)
select 时间,厂家名称,count(*) from '|| check_table || ' where 时间=' || '''' || time || '''' || ' group by 时间,厂家名称 ';
EXECUTE sql;
2、提取check_table表的所有字段名,存入tmp_check_col
sql := 'create temp table tmp_check_col as SELECT a.attname
FROM pg_class as c,pg_attribute as a
where c.relname = '''||check_table||''' and a.attrelid = c.oid and a.attnum>0
and a.attname not in ( ' ||''''||'时间'||''''||' ) ';
EXECUTE sql;
3、打开游标
open datcheck_C FOR
SELECT attname from tmp_check_col ;
4、读取游标,并循环逐个读出字段名
FETCH datcheck_C INTO colname ;
while (colname.attname is not null) loop
5、循环体内,计算为空记录数 [num] 除以 步骤1中的记录总,得到 某字段的缺失率,并更新到对应的单元格内
sql := 'update '||result_table||' b set '||colname.attname||'=(SELECT round(a.num::numeric/b.记录总数::numeric,4) FROM
(
select 时间,厂家名称,count(*) as num from '||check_table||' where '||colname.attname||' is not null and 时间 ='''||time||''' group by 时间, 厂家名称
) a
WHERE a.时间=b.时间 and a.厂家名称=b.vendor_name) where 时间='''||time||'''';
EXECUTE sql;
sql := 'update '||result_table||' set '||colname.attname||' =0 where 时间='''||time||''' and '||colname.attname||' is null';
EXECUTE sql;
FETCH datcheck_C INTO colname;
END loop;
1、提取check_table表的所有字段名,存入tmp_check_col
sql := 'create temp table tmp_check_col as SELECT a.attname
FROM pg_class as c,pg_attribute as a
where c.relname = '''||check_table||''' and a.attrelid = c.oid and a.attnum>0
and a.attname not in ( ''时间'' ) ';
EXECUTE sql;
2、打开游标
open datcheck_C FOR
SELECT attname from tmp_check_col
3、读取游标,逐个读出字段名
FETCH datcheck_C INTO colname ;
while (colname.attname is not null) loop
4、循环体内,向result_table插入某字段为空的记录
sql :='insert into '||result_table||' select * from '||check_table||' where '||colname.attname||' is null and 时间 ='''||time||'''';
EXECUTE sql;
5、循环体内,向check_table删除某字段为空的记录
sql :='delete from '||check_table||' b where '||colname.attname||' is null and 时间 ='''||time||'''';
EXECUTE sql;
FETCH datcheck_C INTO colname;
END loop;
CLOSE datcheck_C;
已有 0 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐