2010-11-23 41 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成本。雙贏。