SimpleJdbcCall没有返回执行返回REF CURSOR的Oracle函数的结果

时间:2014-03-22 10:36:06

标签: java oracle spring-jdbc sql-function ref-cursor

这就是我所拥有的:

功能规格:

FUNCTION GET_SOME_DATA RETURNS REF CURSOR 
IN_LOOK_UP_PARAM VARCHAR2 IN

Java Code Snippet:

    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函数/ Simple Jdbc调用中错误地做了什么吗?

1 个答案:

答案 0 :(得分: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);