SQL查询中的游标值

时间:2010-11-23 08:12:53

标签: sql plsql

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

2 个答案:

答案 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成本。双赢。