在package里面,用动态生成的SQL建立了一个ref cursor,现在不知道如何去取列值,因为列名是动态的定义cursor:type   curtype   is   ref   cursor;   
  cur_data   curtype;   动态sql:select z.item,'||V_COL||'
      from view_colevent v, z_audience_overview z
     where v.audience(+) = z.item
       and z.report_name = ''audience_overview''
     group by z.item, z.sort_order
     order by z.sort_order
其中 V_COL='sum(decode(v.product_type,'pp',1,0)'打开cursor:
 open cur_data for v_sql;取值:   for V in cur_data loop    在这里,如何取值呢? V.???? 因为列名不定非常感谢各位大侠指点!!!
解决了,另送100分

解决方案 »

  1.   

    给 你个例子
    declare
      v_yhbh varchar2(10);
      v_yhmc varchar2(60);
      i number:=1;
      cursor bh_list is select distinct yhbh,yhmc from dbuser_manager order by yhmc ;
    begin
      open bh_list;
      fetch bh_list into v_yhbh,v_yhmc;
      while bh_list %found loop
         add_list_element('BLK_LOGON.userid',i,v_yhmc,v_yhbh);
         i:=i+1;
         fetch bh_list into v_yhbh,v_yhmc;
       end loop;
      close bh_list;
    end;
      

  2.   

    给'||V_COL||'起个别名不就行了吗?
    select z.item,'||V_COL||' new_col 
          from view_colevent v, z_audience_overview z 
        where v.audience(+) = z.item 
          and z.report_name = ''audience_overview'' 
        group by z.item, z.sort_order 
        order by z.sort_order 
      

  3.   

    我咱看你的V_COL指的就是一列啊,没有多列啊
      

  4.   

    我来了
    貌似我没写明白
    列数是不一定的其中
    V_COL='sum(decode(v.product_type,'pp',1,0)' || 'sum(decode*(*&&(*)' || ....||...||是通过一个Sql 循环生成的
      

  5.   

    贴上生成的代码 FOR V IN (SELECT PRODUCT_DESCRIPTION_ENGLISH,PRODUCT_TYPE FROM Z_PRODUCTS WHERE CONF_ID=ICONF_ID AND PRODUCT_DATE=IDAY ORDER BY PRODUCT_TYPE) LOOP
       
           V_COL:=V_COL||',sum(decode(v.product_type,'''||V.PRODUCT_TYPE||''',1,0))';
       
       
       END LOOP;
      

  6.   

    你循环生成的产生的SQL,其列的数量还一样是固定的.没看到你哪里不固定了.
      

  7.   

    话再说回来,如果你cursor出来的列不固定,
    那取值的时候业务如何去运算?亦即是你将要取出什么结果都不知道,就谈不上进行业务运算了.
    如果你真正是列数不固定,那就要从业务逻辑上去设计了,这就存在判断问题.
      

  8.   


    建议:declare v_cnt number;
    begin
      v_cnt := 0;
    FOR V IN (SELECT PRODUCT_DESCRIPTION_ENGLISH,PRODUCT_TYPE FROM Z_PRODUCTS WHERE CONF_ID=ICONF_ID AND PRODUCT_DATE=IDAY ORDER BY PRODUCT_TYPE) LOOP 
          v_cnt := v_cnt + 1;
          V_COL:=V_COL||',sum(decode(v.product_type,'''||V.PRODUCT_TYPE||''',1,0)) col' || to_char(v_cnt); 
      END LOOP;
    end;----
    现在,由v_cnt可以得到总共有多少列,而且列的名字是a1,a2,a3...以次类推,你由此而访问这些动态的列。
      

  9.   

    楼上的方法不错
    我自己也想出来一种,就是把动态生成的列拼起来,变成一列,然后用语句去拆分非常感谢。
    结贴bw555 和codearts 各拿50
    另外我会开一贴,请两位过来再拿50