定义了一个存储过程,输出参数是游标
open p_CURSOR for
select .....
其中返回四个字段,前三个字段都是表中的字段,第四个字段是经过函数处理计算后的字段,
使用JDBC得到结果集,前三个字段没有问题,都依次取出,但是第四列的数据始终返回null(测试sql第四列有数据)PS:本人对存储过程用的不多
open p_CURSOR for
select .....
其中返回四个字段,前三个字段都是表中的字段,第四个字段是经过函数处理计算后的字段,
使用JDBC得到结果集,前三个字段没有问题,都依次取出,但是第四列的数据始终返回null(测试sql第四列有数据)PS:本人对存储过程用的不多
解决方案 »
- 怎么使用C#读取数据库视图user_views的text字段?数据类型为long,现在读取到C#后显示空
- 修改表的简单操作,有没有这样的语句?
- 那位师兄给详细说下oracle的客户端和服务端有什么区别?
- Oracle有没有这样一个函数
- pl/sql中 的select问题
- oracle数据库向应用程序发送消息的问题
- Oracle 触发器是不是有点弱.不能完成我要的任务.
- ORCCLE816 客户端连不上服务器,但令一个服务器可以连上,怎么回事?
- oracle 发送 tcp / udp 的包?
- Oracle 实现数据同步
- 紧急求助PL/SQ随机插入数据问题!!!!!!
- OCI OCIDefineByPos函数绑定变量问题!
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
然后再试试objs[3] = rs.getObject(4); 看能否取到值。
java get的时候,用对应 的getString ,getInt,getDouble之类的来操作。
System.out.println(rs.getDouble(4));
输出0.0
确认你的第四列有返回值吗?
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这列有返回值
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
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
// 转换参数类型
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时,存储过程可以行到正确的结果