0

这是我所拥有的:

功能规格:

FUNCTION GET_SOME_DATA RETURNS REF CURSOR 
IN_LOOK_UP_PARAM VARCHAR2 IN

Java 代码片段:

    SimpleJdbcCall call =
        new SimpleJdbcCall(jdbcTemplate)
            .withCatalogName(SP_PACKAGE_NAME)
            .withFunctionName("GET_SOME_DATA")
            .declareParameters(
                new SqlOutParameter(
                    SP_OUT_PARAM_RESULTS, 
                    OracleTypes.CURSOR, 
                    HEADER_ROW_MAPPER))
            .declareParameters(new SqlParameter(SP_IN_PARAM, Types.VARCHAR))
            .withoutProcedureColumnMetaDataAccess()
            .withReturnValue()
            .returningResultSet(SP_OUT_PARAM_RESULTS, HEADER_ROW_MAPPER);
    call.setFunction(true);
    call.compile();
    Map<String, Object> resultMap = call.execute(
        new MapSqlParameterSource().addValue(SP_IN_PARAM, lookupId));

不调用行映射器方法 resultMap 包含SP_OUT_PARAM_RESULTS值为 null 的键。

当尝试对此进行调试时,在 Spring 库代码中的过程执行后的某个时刻,更新计数返回为 -1,因此调用行映射器的代码路径被跳过。

知道我在任何 oracle 函数/简单 Jdbc 调用中可能做错了什么吗?

4

1 回答 1

0

我没有看到任何不会使该代码工作的东西。不过,您的函数规范看起来不完整 - 您是否有创建函数的完整语句?

试试这个功能:

CREATE OR REPLACE FUNCTION CURSOR_DEMO (p_in IN VARCHAR2) RETURN SYS_REFCURSOR 
IS
  p_cursor SYS_REFCURSOR;
BEGIN
  open p_cursor FOR SELECT p_in AS P1 FROM DUAL;
  RETURN p_cursor;
END CURSOR_DEMO;

使用这个 SimpleJdbcCall:

    SimpleJdbcCall call = new SimpleJdbcCall(dataSource)
            .withFunctionName("CURSOR_DEMO")
            .declareParameters(
                    new SqlOutParameter("RESULTS", OracleTypes.CURSOR, new ColumnMapRowMapper()),
                    new SqlParameter("P_IN", Types.VARCHAR))
            .withoutProcedureColumnMetaDataAccess();
    SqlParameterSource params = new MapSqlParameterSource("P_IN", "TEST");
    Map<String, Object> results = call.execute(params);
    System.out.println(results);
于 2014-03-24T14:59:10.227 回答