SimpleJdbcCall 类型问题和引用游标

问题描述 投票:0回答:0

我有一个来自 Oracle 数据库的存储过程。我正在尝试使用 SimpleJdbcCall 在我的 DAO 中使用 Spring Boot 项目调用数据库(我在另一个文件中创建了一个 simpleJdbcCallFactory)。在 Oracle SQL Developer 内部,我能够使用以下命令成功调用数据库并获得所需的结果:

SET SERVEROUTPUT ON
variable v_cur refcursor
call ABC.DATABASE_DATA.PROCEDURE_GET_DATA('', '', '1234', :v_cur)

// takes in PARAM1, PARAM2, PARAM3, out v_cur

我相信 ref cursor 是导致我出现问题的原因,因为我不确定如何正确处理它。

其他需要注意的细节:

  • 在 Oracle SQL Developer 中,我可以看到 PARAM1PARAM2PARAM3 都是模式 IN 和数据类型 VARCHAR2(200)。 RETCUR 是模式 OUT & 数据类型 DATABASE_DATA.PRRETCUR.

  • 正在使用 Spring Boot 3 和 Java 17。数据库是 Oracle SQL 数据库。

  • 我无法更改任何关于包或数据库的信息。这不是我的数据库。

ATTEMPT 1:使用 SimpleJdbcCall(高度推荐)

// input = MapSqlParameterSource().addValue("PARAM1", param1).addValue("PARAM2", param2).addValue("PARAM3", param3);

public DBResponse retrieveData(SqlParameterSource input) {
    DBResponse dbResponse = new DBResponse();

    try {
        SimpleJdbcCall simpleJdbcCall = simpleJdbcCallFactory.create(jdbcTemplate);
        simpleJdbcCall.withSchemaName("ABC")
            .withCatalogName("DATABASE_DATA")
            .withFunctionName("PROCEDURE_GET_DATA")
            .withoutProcedureColumnMetaDataAccess()
            .declareParameters(
                new SqlOutParameter("v_cur", OracleTypes.REF_CURSOR),
                new SqlParameter("PARAM1", Types.VARCHAR),
                new SqlParameter("PARAM2", Types.VARCHAR),
                new SqlParameter("PARAM2", Types.VARCHAR)
            }
        String out = simpleJdbcCall.executeFunction(String.class, input);
        dbResponse.setResult(out)
    } catch (Exception exception) {
        // exception code ...
    }

请注意,我有一个服务文件将解析存储在 dbResponse 中的结果。这导致以下错误:

"message":"Extracted SQL state class '65' from value '65000'"

...

"stacktrace":"org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar [{call ABC.DATABASE_DATA.PROCEDURE_GET_DATA(?, ?, ?, ?)}]
...
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'PROCEDURE_GET_DATA'
Statement ignored"...

ATTEMPT 2:使用 JdbcTemplate 和 queryForObject(不是首选)

public DBResponse retrieveData(SqlParameterSource input) {
    DBResponse dbResponse = new DBResponse();
    MyMapper refcurs = new MyMapper();
    String sqlQuery = "call ABC.DATABASE_DATA.PROCEDURE_GET_DATA('', '', '1234', :v_cur)"l;

    try {
        dbResponse = jdbcTemplate.queryForObject(sqlQuery, new MyMapper());
            }
        String out = simpleJdbcCall.executeFunction(String.class, input);
        dbResponse.setResult(out)
    } catch (Exception exception) {
        // exception code ...
    }

这导致以下错误:

"message":"Extracted SQL state class '72' from value '72000'"

...

"stacktrace":"org.springframework.jdbc.UncategorizedSQLException: StatementCallback; uncategorized SQLException for SQL [call ABC.DATABASE_DATA.PROCEDURE_GET_DATA(?, ?, ?, :v_cur)]; SQL state [72000]; error code [1008]; ORA-01008: not all variables bound"
...

非常感谢大家的时间和精力,如果需要更多信息,我很乐意提供!

spring-boot jdbc oracle-sqldeveloper spring-jdbc jdbctemplate
© www.soinside.com 2019 - 2024. All rights reserved.