SimpleJDBC在ORACLE数据库中调用存储过程

时间:2017-11-28 13:52:41

标签: java stored-procedures

我正在尝试使用simpljdbccall或jdbccall或namedtemplatejdbc来实现具有结果集的代码

代码将使用我的存储过程,即具有输入参数和REF游标的数据库proc。

我没有找到任何代码可以帮助我将游标提取为输出,以便使用JDBC在我的结果集中包含所有多行详细信息

数据库程序

BOOKING_PG.get_infant_info_pr(

    c_booking_id                      IN T_BOOKED_INFANT_INFO.BOOKING_ID%TYPE,
    c_booked_infant_details           OUT    booked_infant_details
)
  OPEN c_booked_infant_details  FOR
  SELECT
  BOOKING_ID                      c_booking_id,
  BOOKED_INFANT_INFO_ID             c_booked_infant_info_id,
  BOOKED_ADULT_PAX_INFO_ID      c_booked_adult_pax_info_id,

  FROM  T_BOOKED_INFANT_INFO T
  WHERE T.BOOKING_ID = c_booking_id
  and T.STATUS_ID = 1; 

JAVA代码

SimpleJdbcCall call = new SimpleJdbcCall(dataSource2)
                .withCatalogName("BOOKING_PG")
                .withProcedureName("get_infant_info_pr")
                .withoutProcedureColumnMetaDataAccess()
                .returningResultSet("rs1", new ParameterizedRowMapper() {
                    @Override
                    public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException {
                        return new Object[]{rowNum, rs.getLong("c_booking_id"), rs.getLong(c_booked_infant_info_id) , rs.getLong(c_booked_adult_pax_info_id)};
                        }
                });
        SqlParameterSource in = new MapSqlParameterSource()
                .addValue(C_BOOKING_ID, bookingId);

        Map<String, Object> res = call.execute(in);

        List<Object[]> l1 = (List<Object[]>)res.get("rs1");

抛出SQL错误

org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar [{call EURONOVA.BOOKING_PG.GET_INFANT_INFO_PR(?)}]; nested exception is java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'GET_INFANT_INFO_PR'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

我不确定代码中是否有错误,或者我们必须按照一些不同的方式在simplejdbc调用中获取结果集

有人可以帮我解决这个话题吗?

1 个答案:

答案 0 :(得分:0)

首先创建一个类,该类具有与游标返回的数据类型和名称相似的名称。 在您的情况下,创建一个名为BookedInfantDetails.java

的类
+-------+-----------+--------+----------+--------+
| RefNo |  TranType |  Code  | Remarks  | Amount |
+-------+-----------+--------+----------+--------+
|     1 | BD        | 400201 | abcc dfr |    200 |
|     1 | BD        | 400202 | abcc dfr |    200 |
|     2 | BD        | 400204 | defrt    |    300 |
|     2 | BD        | 400205 | defrt    |    300 |
+-------+-----------+--------+----------+--------+

}

现在在jdbccall中声明in和out参数,并使用beanproperty rowmapper将ref游标映射到该类。

+-------+--------+--------+----------+----------+--------+
| RefNo | Code1  | Code2  | TranType | Remarks  | Amount |
+-------+--------+--------+----------+----------+--------+
|     1 | 400201 | 400202 | BD       | abcc dfr |    200 |
|     2 | 400204 | 400205 | BD       | defrt    |    300 |
+-------+--------+--------+----------+----------+--------+

查找有关spring文档的更多详细信息。 https://docs.spring.io/spring-data/jdbc/old-docs/1.2.1.RELEASE/reference/html/orcl.datatypes.html#orcl.datatypes.ref_cur