我有一个来自 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 中,我可以看到 PARAM1、PARAM2 和 PARAM3 都是模式 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"
...
非常感谢大家的时间和精力,如果需要更多信息,我很乐意提供!