oracle存储过程如何返回list,并用jdbc调用
2015-09-16 15:58
627 查看
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;
}
相关文章推荐
- oracle存储过程
- oracle修改密码永不过期(默认180天过期)
- Oracle查询补全
- Oracle数据库异机升级
- oracle创建dblink问题
- Qlikview配置ODBC连接ORACLE/SQL SERVER
- 有关oracle的一些用户命令
- 安装12c遇到 Error in invoking target 'irman ioracle' of makefile
- oracle 锁机制
- 导入cx_Oracle时提示"DLL load failed"问题解决
- oracle11g空表不能导出记录
- Oracle数据库分页
- Oracle GoldenGate学习之windows下ogg单向复制配置
- Oracle GoldenGate的思想天空--感悟OGG的本质
- oracle AWR解析报告内容说明
- Oracle通过job定时执行任务
- 安装oracle无法使用命令/usr/bin/xdpyinfo自动检查显示器颜色
- Oracle 11gR2 警告文件的位置
- 【Oracle】ORA-03113错误分析与解决
- Oracle goldengate的OGG-01004 OGG-1296错误