2010-11-23 33 views
0
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个柱也应该给5SQL查询中的光标值

+0

请改善格式,这是非常难以阅读。并且请至少添加您所期望的TNAME的值。当你不知道理想的结果时,很难改进/纠正某些事情。 – 2010-11-23 08:38:40

+0

不好意思,但是你的代码没什么意义。它看起来并不像你知道自己在做什么,更像是一个狂野的复制粘贴会话,只是有一些试验和错误。 – 2010-11-23 08:49:25

回答

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

只是一个小提示:为了您的鼠标使用:

SELECT column_name 
FROM all_tab_columns 
WHERE table_name = 'SER_SHIV_SYN' 

相反shiv_tab_col。

该表格会自动更新并始终存在。 它也有字段类型,大小等等一切和更多的0成本。双赢。