我需要使用jdbc调用以下两个Oracle过程:
create or replace PROCEDURE PROC_GetReportGoogleMapData (
p_SubsID number , cur OUT SYS_REFCURSOR)
...)
create or replace PROCEDURE PRC_GET_PRFMANA_RPT_DATA (
p_SubsID VARCHAR2, p_psi varchar2, p_psy number, p_PageSize number,
p_CurrentPageNo number, p_TotalPageCount VARCHAR2, p_TotalRecordsCount VARCHAR2,
cur OUT SYS_REFCURSOR, cur1 OUT SYS_REFCURSOR
...
)
使用ojdbc7.jar Java客户端代码
private static void namedCall(Connection connection) throws SQLException {
try (CallableStatement prepareCall = connection
.prepareCall("{call PRC_GET_PRFMANA_RPT_DATA(?,?,?,?,?,?,?,?,?)}")) {
prepareCall.registerOutParameter("cur", -10); //oracle.jdbc.OracleTypes.CURSOR
prepareCall.registerOutParameter("cur1", -10);
prepareCall.setString("p_SubsID", "1000");
...
prepareCall.setString("p_TotalRecordsCount", "");
int execute = prepareCall.executeUpdate();
System.out.println(execute);
try (ResultSet resultSet = (ResultSet) prepareCall.getObject("cur"))
{
System.out.println("PRC_GET_PRFMANA_RPT_DATA()named:" + resultSet);
}
}
}
我不允许在我的代码中直接使用Oracle类。
当我测试 PROC_GetReportGoogleMapData 时,prepareCall.getObject(" cur")返回了一个有效的ResultSet。
但是当我尝试调用PRC_GET_PRFMANA_RPT_DATA时,prepareCall.getObject(" cur")返回 null 。
调试时我在后面的例子中找到了oracle.jdbc.driver。 T4CResultSetAccessor .unmarshalBytes(),
int i = (int)this.mare.unmarshalUB4();// line#309
我变成< = 0
所以,其他内部正在执行:
this.newstmt[this.lastRowProcessed] = null;
因此,T4CResultSetAccessor.getCursor(int paramInt)返回 null 。
环境:
Java版本:1.8.0_60,供应商:Oracle Corporation
默认语言环境:en_US,平台编码:Cp1252
操作系统名称:&#34; Windows 7&#34;,版本:&#34; 6.1&#34;,arch:&#34; amd64&#34;,家庭:&#34; dos&#34; < / p>
NLSRTL 12.1.0.2.0生产
Oracle Database 12c企业版12.1.0.2.0 64位生产
PL / SQL 12.1.0.2.0生产
适用于Linux的TNS:12.1.0.2.0生产