如何在for循环中存储多列输出

How to store mutiple column output in a for loop

设计一个函数来显示 column_name 和空值的计数

预计o/p Col_name,总计数 美国广播公司 45 防御 30 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 错误 Message:record "i" 没有字段 "column_name"

需要指导来解决错误

好吧,我试过你的代码并得到了一些不同的错误:

Err Msg: 42702 Error Message:column reference "column_name" is ambiguous

确实,您在 return 类型和 select (select column_name from...) 中使用了 column_name。当我更改为 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 || '

但请记住,您在 for 循环的查询中将 table_schema 和 table_name 硬编码为 xyz.xyz

我正在使用 PostgreSQL 9.5.3 进行测试。