试试这个
DECLARE
null_sum NUMBER := 0;
null_count NUMBER;
BEGIN
FOR aCol IN (SELECT COLUMN_NAME FROM USER_TAB_COLS WHERE TABLE_NAME = 'SOME_TABLE') LOOP
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM SOME_TABLE WHERE condition = true AND '||aCol.COLUMN_NAME||' IS NULL' INTO null_count;
null_sum := null_sum + null_count;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Table SOME_TABLE has '||null_sum||' NULLS');
END;
而不是做你可以使用DBMS_SQL包写一个动态语句每列一个循环,但是这是更多的精力编写和价值只有在你关心性能。
编辑:找到一个更好的一个没有多个SELECTS的:
DECLARE
cols VARCHAR2(1000);
null_count NUMBER;
BEGIN
FOR aCol IN (SELECT COLUMN_NAME FROM USER_TAB_COLS WHERE TABLE_NAME = 'SOME_TABLE') LOOP
cols := cols||'NVL2('||aCol.column_name||',0,1)+';
END LOOP;
EXECUTE IMMEDIATE 'SELECT SUM('||REGEXP_REPLACE(cols, '\+$')||') FROM SOME_TABLE WHERE condition = true' INTO null_count;
DBMS_OUTPUT.PUT_LINE ('null_count = ' || null_count);
END;
感谢您的快速回复!我认为这可能会做到。我之前没有成功使用过病例功能,但我认为我错误地使用了它。 编辑: 我刚刚检查出来。这将工作。非常感谢你! – nmaybyte