定义了一个存储过程,输出参数是游标
open p_CURSOR for
  select .....
其中返回四个字段,前三个字段都是表中的字段,第四个字段是经过函数处理计算后的字段,
使用JDBC得到结果集,前三个字段没有问题,都依次取出,但是第四列的数据始终返回null(测试sql第四列有数据)PS:本人对存储过程用的不多

解决方案 »

  1.   

    游标定义
    create or replace package ResultSetPackage as
    type rs is ref cursor;
    --还可以定义其他内容
    end ResultSetPackage;
    存储过程
    create or replace procedure CP_DB_KQXT(startDate in Date, endDate in Date,
           p_CURSOR  out ResultSetPackage.rs) is
    begin
       open p_CURSOR for
            select t1.N_BH,t1.C_XM,t3.C_MC,round(sum(TO_NUMBER(t2.d_xbsj - t2.d_sbsj) * 24-1),2)
             from T_ZZJG_RYZH t1 left join T_RY_KQXX t2 
                on t1.N_BH=t2.N_RYBH  and t2.D_SBSJ>=startDate and t2.D_XBSJ<=endDate 
            left join T_ZZJG_BM t3 on t1.N_ZGBMBH=t3.N_BH
            group by t1.N_BH,t1.c_xm,t3.c_mc;
    end CP_DB_KQXT;java代码
    proc.setDate(1, startDate);
    proc.setDate(2, endDate);
    proc.registerOutParameter(3,
    oracle.jdbc.OracleTypes.CURSOR);
    // 执行存储过程,得到返回结果
    proc.execute();
    ResultSet rs = (ResultSet) proc.getObject(3);
    List list = new ArrayList();
    while (rs.next()) {
     Object[] objs = new Object[4];
     objs[0] = rs.getObject(1);
     objs[1] = rs.getObject(2);
     objs[2] = rs.getObject(3);
     objs[3] = rs.getObject(4);
     list.add(objs);
    }
    其中objs[3]为null
      

  2.   

    round(sum(TO_NUMBER(t2.d_xbsj - t2.d_sbsj) * 24-1),2) 加个别名 as MYCOL
    然后再试试objs[3] = rs.getObject(4); 看能否取到值。
      

  3.   

    round(sum(TO_NUMBER(t2.d_xbsj - t2.d_sbsj) * 24-1),2)  加个别名。
    java get的时候,用对应 的getString ,getInt,getDouble之类的来操作。
      

  4.   

    加国别名
    System.out.println(rs.getDouble(4));
    输出0.0
      

  5.   

    0.0是double的默认值!
    确认你的第四列有返回值吗?
      

  6.   

    执行:select  t1.N_BH,t1.C_XM,t3.C_MC,round(sum(TO_NUMBER(t2.d_xbsj - t2.d_sbsj) * 24-1),2) as zgs
           from T_ZZJG_RYZH t1 left join T_RY_KQXX t2 
                on t1.N_BH=t2.N_RYBH  and t2.D_SBSJ>=sysdate-5 and t2.D_XBSJ<=sysdate+1 
           left join T_ZZJG_BM t3 on t1.N_ZGBMBH=t3.N_BH
           group by t1.N_BH,t1.c_xm,t3.c_mc
             order by zgs ;
    zgs这列有返回值
      

  7.   

    zgs这列的返回值是不是有空值呀?
      

  8.   

    应该这样写:
    select  t1.N_BH,t1.C_XM,t3.C_MC,nvl(round(sum(TO_NUMBER(t2.d_xbsj - t2.d_sbsj) * 24-1),2),999999) as zgs
              from T_ZZJG_RYZH t1 left join T_RY_KQXX t2
                   on t1.N_BH=t2.N_RYBH  and t2.D_SBSJ>=sysdate-5 and t2.D_XBSJ   <=sysdate+1
              left join T_ZZJG_BM t3 on t1.N_ZGBMBH=t3.N_BH
              group by t1.N_BH,t1.c_xm,t3.c_mc
                order by zgs ;
    就是如果第四列为空值的话 将其指定为999999
      

  9.   

    select  t1.N_BH,t1.C_XM,t3.C_MC,nvl(round(sum(TO_NUMBER(t2.d_xbsj - t2.d_sbsj) * 24-1),2),999999) as zgs 
              from T_ZZJG_RYZH t1 left join T_RY_KQXX t2 
                  on t1.N_BH=t2.N_RYBH  and t2.D_SBSJ>=sysdate-5 and t2.D_XBSJ  <=sysdate+1 
              left join T_ZZJG_BM t3 on t1.N_ZGBMBH=t3.N_BH 
              group by t1.N_BH,t1.c_xm,t3.c_mc 
                order by zgs ;
    执行这条sql时为第四列为空时是999999,但是有一行的第四列不为空,执行出了正确的结果。
    通过存储过程执行时,我将两个时间的条件限制取消,也得到了正确的结果,加上那个时间条件限制得到了全部的999999
      

  10.   

    现在问题清晰了,是stratDate和endDate这两个参数的传递或使用上出问题了
      

  11.   

    大概问题的原因清楚了,我在java程序里使用
    // 转换参数类型
    SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
    java.util.Date utilStartDate = ft.parse(params[0]);
    java.sql.Date startDate = new java.sql.Date(utilStartDate.getTime());
    1.转换成了SQL的Date类型,2.在存储过程中使用startDate in Date, endDate in Date定义,
    3. t2.D_SBSJ>=startDate and t2.D_XBSJ<=endDate+1 进行赋值,这三个地方不知道哪里出了问题
    当我把两个参数变为sysdate-5和sysdate+5时,存储过程可以行到正确的结果