具有多个REF_CURSOR的存储过程:CallableStatement.getObject(parameterName)返回null

时间:2017-08-29 13:22:58

标签: java oracle jdbc

我需要使用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生产

0 个答案:

没有答案