你的公式表里存的是字符串,得写一个解析程序来解释这个字符串为公式,恐怕单单用sql是解决不了的。

解决方案 »

  1.   

    我通过decode进行处理
    问题基本解决
      

  2.   

    用decode能解决固定代码的处理,但是你的问题不是这样,如果公式表中新增了纪录或者修改了纪录,你是不是还要修改decode?如果是这样,那设定一个公式表还有什么意义?不如直接把逻辑写入代码中
      

  3.   

    --获取公式
              open c_RefSalFormula(pRefProj_id,1);
              
              --   设置构造 sql 的辅助部分
              v_SumPart := ' sum(decode(''SAL'' || SAL_ID || ''[PROJ'' || PROJ_ID || '']'',''SAL';
              v_FromPart := ' from T_PAYOFF  ';
              v_WhereDatePart := ' where PAYOFF_DATE between to_date(''' || to_char(calStartDate) || ''') and to_date(''' || to_char(calEndDate) || ''')' ;
              v_GroupPart := ' group by PERS_ID ';
              
              --构造sql
              Loop
                  fetch c_RefSalFormula into v_SalFormula;
                  exit when c_RefSalFormula%NOTFOUND;              v_sFormula := v_SalFormula.REFFORMULA;
                  
                  --构造select 部分
                  v_SelectPart := 'select ' || v_SalFormula.REFPROJ_ID || ' REFPROJ_ID,'
                               || v_SalFormula.SAL_ID || ' SAL_ID, PERS_ID, ' ;              --   根据公式处理
                  If Length(v_sFormula) > 0 Then
                     dbms_output.put_line(v_test);
                     v_sFormula := Replace(v_sFormula, ']', ']]');
                     v_sFormula := Replace(v_sFormula, 'SAL', v_SumPart);
                     v_sFormula := Replace(v_sFormula, ']]', ']'',SAL))' );                 v_Formula := v_SelectPart || v_sFormula || v_FromPart || v_WhereDatePart || v_GroupPart;
                     
                 --  组合
                     If Length(Trim(v_sSql)) > 0 Then
                        v_sSql := v_sSql || ' union ( ' || v_Formula || ' )';
                     Else
                        v_sSql := ' ( ' || v_Formula || ' )';
                     end if;
                     
                    dbms_output.put_line('union.............');
                  end if;
              end loop;
              
              If Length(Trim(v_sSql)) > 0 Then
              
                 open SalCursor for v_sSql;
                     
              end if;          close c_RefSalFormula;