尝试这个
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 包编写单个动态语句,而不是为每一列执行循环,但这需要更多的编码工作,并且只有在您关心性能时才值得。
编辑:找到一个更好的没有多个选择的:
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;