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

时间:2017-10-16 22:55:15

标签: greenplum

设计一个显示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"

需要指导来解决错误

1 个答案:

答案 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进行测试。