做一个oracle存储过程,里面的部分语句如下:
  sql_str:='select cmpTempTB.FPERSONID,person.FNumber,person.FName_L2 FempName,org.Fnumber FempOrgNum,org.fdisplayname_l2 FempOrgName,Position.Fnumber FPstNum,Position.FName_L2 FPstName,'||
                 ' CmpPeriod.FNumber FcmpPrdNum,subStr(CmpPeriod.FNumber,0,4) FcmpPrdYear,subStr(CmpPeriod.FNumber,5,6) FcmpPrdMonth,empClassify.Fnumber FempClsNum,empClassify.Fname_L2 FempClsName,'||
                 ' PositionType.FNumber FPstTypeNum,PositionType.FName_L2 FPstTypeName'||
                 --' ,case select  count(*)  from user_tab_cols where table_name='||rs.FHISTABLENAME||'and column_name="FSAL029" when 0 then 0 else FSAL029 end ftestfld '||
                 --',case FSAL029 when null then 0 else FSAL029 end FSAL029'||
                 ',case select count(*)  from user_tab_cols  where table_name = upper('||rs.FHISTABLENAME||')  and column_name = upper("FSAL240")  when 0 then 0 else FSAL240 end FSAL240'||
                 ' from '||rs.FHISTABLENAME||' cmpTempTB'||
                 ' left join T_BD_person  person on cmpTempTB.FPERSONID=person.Fid'||
                 ' left join T_ORG_BaseUnit org On cmpTempTB.FADMINORGUNITID=org.FID'||
                 ' left join T_ORG_Position Position On cmpTempTB.FPOSITIONID=Position.FID '||
                 ' left join T_HR_CMPPERIOD CmpPeriod on cmpTempTB.FPeriod=CmpPeriod.FID'||
                 ' left join T_HR_EmployeeClassify empClassify on person.FEmployeeClassifyID=empClassify.Fid'||
                 ' left join T_BD_PositionType PositionType on Position.FPositionTypeID=PositionType.FID'||
                 ' where to_number(subStr(CmpPeriod.FNumber,0,4))='||baseYear||' or to_number(subStr(CmpPeriod.FNumber,0,4))='||cmpYear;
      
其中rs.FHISTABLENAME是外围循环得出的一个动态数据表,在这个表中要查出一些字段,有些字段存在,有些字段不存在。我要求不存在的字段也把列出来,只不过内容是0.问题就出现在这句,因为出现这句话所以调试错误,无法执行成功:
                 ',case select count(*)  from user_tab_cols  where table_name = upper('||rs.FHISTABLENAME||')  and column_name = upper("FSAL240")  when 0 then 0 else FSAL240 end FSAL240'||在这句中,我要判断rs.FHISTABLENAME这个动态表里是否存在FSAL240 字段,如果不存在,则显示0,如果存在,则显示FSAL240字段里的内容。存不存在该字段,都要把这个字段显示出来。
在这种语句中应该怎么做判断呢,请各位帮出个点子?

解决方案 »

  1.   

    这句不能和查询语句放到一起,要先执行,得到结果才能决定sql_str的内容。
    先查询,判断结果再决定sql_str中是否有这么一段。不能一次又是查询,又是判断。
    select count(*) into v_count from user_tab_cols where table_name = upper(rs.FHISTABLENAME) and column_name = upper('FSAL240')
      

  2.   

    ',case select count(*) from user_tab_cols where table_name = upper('''||
    每个这种地方都少了'',这样导致你拼得sql错误。因为字串的界定符没了。。
      

  3.   

    另外思路也有点问题,应该是在外面判断字段是否存在,然后决定字段是否拼到动态sql的字符串中
      

  4.   

    create or replace procedure proc_just_test(i_col varchar2,
                                               o_cur out sys_refcursor) as
      n_cnt number;
      v_sql varchar2(1000);
    begin
      select count(*)
        into n_cnt
        from user_tab_cols t
       where t.table_name = 'EMP';
      v_sql := 'select ' || case when n_cnt = 0 then cast(0 as varchar2) else i_col end || ' from emp';
      open o_cur for v_sql;
    end;