oracle存储过程如何返回list,并用jdbc调用

  


oracle没有直接的返回List的方法,这里需要有包定义一个Cursor(游标)的返回类型。下面是我在计算收益率的一段代码,只做参考。

oracle包的写法如下:

CREATE OR REPLACE PACKAGE CAL_RTN_PACK IS
       
  TYPE mycursor IS REF CURSOR;

 PROCEDURE getRtnListByPid_proc (
       p_pid IN tbsi_ante_port.p_id%TYPE,
       x_rs OUT mycursor
  );
END CAL_RTN_PACK;


create or replace package body cal_rtn_pack is

 PROCEDURE getRtnListByPid_proc (
       p_pid IN tbsi_ante_port.p_id%TYPE,
       x_rs OUT mycursor
  )
 IS
       v_start_date DATE; --每年第一个工作日
       v_bm_id tbsi_ante_port.bm_id%TYPE;
       v_bm_date DATE; --基准计算时间
       v_p_date DATE; --基金开始时间
 BEGIN
   SELECT
       min(bm_id) INTO v_bm_id
   FROM tprt_bench_drill b
   WHERE b.p_id = p_pid
   AND b.isdefault = DECODE(b.isdefault, 1, 1, b.isdefault);
   
   SELECT min(BEG_DATE) INTO v_bm_date
   FROM tbsi_ante_port
   WHERE p_id = p_pid
   AND bm_id = v_bm_id;
   
   SELECT min(BEG_DATE) INTO v_bm_date
   FROM tbsi_ante_port
   WHERE p_id = p_pid;
   
   IF v_bm_date > v_start_date AND v_p_date < v_start_date THEN 
     --当基准开始时间不在年初且基金生效时间小于年初 不计算
    NULL;
   ELSE
     OPEN x_rs FOR
     SELECT bm_id, beg_date, inv_rtn, inv_rtn_bench
     FROM tbsi_ante_port
     WHERE p_id = p_pid
     AND bm_id = v_bm_id;
   END IF;
   
 END getRtnListByPid_proc;
 
end cal_rtn_pack;

2. 要在java端接收这个返回的游标
public List<PLMTbsiAntePort> getRtnListByPid(String pid) {
Session session = null ;
Connection conn = null ;
CallableStatement st = null ;
String sql = "{call CAL_RTN_PACK.getRtnListByPid_proc(?, ?)}" ;

List<PLMTbsiAntePort> list;
try {
session = this .getMetaDBContext().getSession();
conn = session.connection();
st = conn.prepareCall(sql);
st.setString( 1 , pid);
st.registerOutParameter( 2 , OracleTypes. CURSOR );
st.execute();

ResultSet rs = null ;
rs = (ResultSet)st.getObject( 2 );
list = new ArrayList<PLMTbsiAntePort>();
while (rs.next())
{
PLMTbsiAntePort antePort = new PLMTbsiAntePort();
antePort.setBmId(rs.getString( 1 ));
antePort.setBegDate(rs.getDate( 2 ));
antePort.setpId(pid);
antePort.setInvRtn(rs.getDouble( 3 ));
antePort.setInvRtnBench(rs.getDouble( 4 ));
list.add(antePort);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return list;
}




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值