【发布时间】:2014-12-28 08:23:14
【问题描述】:
我正在尝试使用 SimpleJdbcCall 功能编写用于调用存储过程的 java 代码。 我使用的是Oracle 10g,下面是需要从我们的代码中调用的过程语法
存储过程语法:
CREATE OR REPLACE PROCEDURE ImportFile(
enametab IN VARCHAR2_TABLE,
saltab IN DBMS NUMBER_TABLE)
存储过程接受 Varchar2.TABLE 类型和 Number_TABLE 类型,这是 Bulk SQL Types 的类型。 我试过下面的java代码来调用存储过程。
Java 代码
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withSchemaName("<<schemaName>>")
.withProcedureName("ImportFile")
.declareParameters(new SqlParameter("enametab", Types.ARRAY),
new SqlParameter("saltab", Types.ARRAY));//
// Creating lists
List<String> enameList = new ArrayList<String>();
enameList.add("one");
enameList.add("two");
List<Integer> salList = new ArrayList<Integer>();
salList.add(1);
salList.add(2);
// Converting list into array
String[] enameArray = enameList.toArray(new String[enameList.size()]);
Integer[] salArray = salList.toArray(new Integer[enameList.size()]);
MapSqlParameterSource in = new MapSqlParameterSource();
in.addValue("enametab", enameArray);
in.addValue("sArchiveName", salArray);
// Executing the stored procedure
simpleJdbcCall.execute(in);
执行上述代码后,我收到错误
Caused by: java.sql.SQLException: Fail to convert to internal representation:
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.sql.ARRAY.toARRAY(ARRAY.java:238)
at oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:9152)
at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:8739)
at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:9229)
at oracle.jdbc.driver.OracleCallableStatement.setObject(OracleCallableStatement.java:4691)
at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:431)
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:235)
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:150)
at org.springframework.jdbc.core.CallableStatementCreatorFactory$CallableStatementCreatorImpl.createCallableStatement(CallableStatementCreatorFactory.java:213)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1115)
... 8 more
有什么帮助/建议吗?
【问题讨论】:
标签: java oracle10g spring-jdbc