设计一个显示column_name和空值计数的函数
预期o / p Col_name,总计数 abc 45 def 30 fgh 10
enter code here
CREATE OR REPLACE FUNCTION gtr_ops.f_column_validation()
RETURNS TABLE
(
column_name character varying(50),
total_blank_records bigint
)
AS
$BODY$
DECLARE
i record;
ecode CHARACTER VARYING(1000);
vsql text;
BEGIN
raise notice 'entering for loop';
for i IN (select column_name from information_schema.columns where table_schema='xyz'
and table_name='xyz')
LOOP
--RAISE NOTICE '%', i.column_name;
column_name := i.column_name;
vsql := 'select count(*) from schema.tablename
where '|| i.column_name||' is null
group by '|| i.column_name;
RAISE NOTICE '%', vsql;
EXECUTE vsql into total_blank_records;
RETURN NEXT;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
ecode := SQLSTATE||' Error Message:'|| SQLERRM;
raise notice 'Err Msg: %',ecode;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
错误 错误消息:42703错误消息:记录"我"没有字段" column_name"
需要指导来解决错误
答案 0 :(得分:0)
好吧,我已经尝试了你的代码,并得到了一个不同的错误:
Err Msg:42702错误消息:列引用" column_name"含糊不清
实际上,您在返回类型和select(column_name
)中使用select column_name from...
。当我改为select columns.column_name from...
时,它有效。
但是,您必须使用适当的值替换schema.tablename
(就像使用i.column_name
一样):
首先:
for i IN (select columns.table_schema, columns.table_name, columns.column_name from information_schema.columns where ...
然后:
vsql := 'select count(*) from ' || i.table_schema || '.' || i.table_name || '
但请记住,您在xyz.xyz
循环中的查询中将table_schema和table_name硬编码为for
。
我正在使用PostgreSQL 9.5.3进行测试。