I have two tables
1.
shiv_tab_col
TABLENAME | COLUMNNAME
--------------------------
SER_SHIV_SYN | TABLENAME
SER_SHIV_SYN | COLUMNNAME
AND SER_SHIV_SYN
TABLENAME | COLUMNNAME
--------------------------
A | B
E | NULL
NULL | NULL
NULL | NULL
NULL | NULL
NULL | NULL
BUT WHEN I M TRYING TO RUN THE BELOW CODE IT IS GIVING ME '0' AS VALUE OF TNAME
DECLARE
tname varchar(20):=null;
CURSOR C1 IS
SELECT *
FROM SHIV_TAB_COL;
BEGIN
for rec in C1
loop
select count(*) into tname from (select nvl(rec.columnname,1)b from ser_shiv_syn) where b ='1';
dbms_output.put_line(tname);
dbms_output.put_line(rec.columnname);
END LOOP;
END;
其实我想算不上。每列中的空值将存储在变量TNAME中
对于第一列,它应该给4
对于2列,它应该给出5
答案 0 :(得分:1)
您现在正在做的是计算表COLUMNNAME
中列shiv_tab_col
的所有空出现位置。哪个是0(你已经发现了)。
解决方案有点复杂,您需要动态SQL来完成您想要做的事情:
declare
l_count pls_integer;
begin
for r_cur in (
select columnname
from shiv_tab_col
)
loop
execute immediate
'select count(1) from ser_shiv_syn where '||r_cur.columnname||' is null'
into l_count;
dbms_output.put_line(l_count);
dbms_output.put_line(r_cur.columnname);
end loop;
end;
/
答案 1 :(得分:1)
只是一个小提示:对于你的光标,请使用:
SELECT column_name
FROM all_tab_columns
WHERE table_name = 'SER_SHIV_SYN'
而不是shiv_tab_col。
此表会自动更新,并且始终在此处。 它还具有字段类型,大小等等。一切都是0成本。双赢。