![](/img/trans.png)
[英]Pass array as input parameter to an oracle stored procedure using simple jdbc call
[英]Oracle 11g: Pass array as input parameter to an oracle stored procedure using simple jdbc call
我有以下存儲過程:
PROCEDURE test( p_a IN VARCHAR_ARRAY, p_b VARCHAR_ARRAY, p_c IN VARCHAR_ARRAY,
p_d VARCHAR_ARRAY , p_e NUMBER_ARRAY, p_f IN NUMBER_ARRAY, p_Results OUT SYS_REFCURSOR);
在哪里
TYPE NUMBER_ARRAY IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
type VARCHAR_ARRAY IS TABLE OF VARCHAR2(1000) INDEX BY BINARY_INTEGER;
現在,我正在嘗試使用SimpleJdbcCallOperations
從 java 調用這個過程。
SimpleJdbcCallOperations jdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withSchemaName(schema)
.withCatalogName(catalog);
final Result result = (Result) response.results().get(Constants.Dal.RESULTS);
final RowMapper<T> rowMapper = result.mapper();
jdbcCall.returningResultSet(Constants.Dal.RESULTS, rowMapper);
SqlParameterSource in = new SqlParameterSource();
in.addValue("p_a", new SqlArrayValue(a), Types.ARRAY, "VARCHAR_ARRAY");
in.addValue("p_b", new SqlArrayValue(b), Types.ARRAY, "VARCHAR_ARRAY");
in.addValue("p_c", new SqlArrayValue(c), Types.ARRAY, "VARCHAR_ARRAY");
in.addValue("p_d", new SqlArrayValue(d), Types.ARRAY, "VARCHAR_ARRAY");
in.addValue("p_e", new SqlArrayValue(e), Types.ARRAY, "NUMBER_ARRAY");
in.addValue("p_f", new SqlArrayValue(f), Types.ARRAY, "NUMBER_ARRAY");
final List<T> results = (List<T>) jdbcCall.executeObject(response.clazz(), in);
其中 a,b,c,d 是 String[] 和 e,f 是 BigDecimal[]
但我收到以下錯誤:
CallableStatementCallback; SQL 的未分類 SQLException [{call test(?, ?, ?, ?, ?, ?, ?)}]; SQL 狀態 [99999]; 錯誤代碼 [17059]; 無法轉換為內部表示:[Ljava.lang.String;@5dadd44e; 嵌套異常是 java.sql.SQLException: Fail to convert to internal representation: [Ljava.lang.String;@5dadd44e"
我嘗試了很多組合.. 使用 List<> 而不是 [] 和 double 而不是 BigDecimal,不同的類型,......任何幫助將不勝感激。
更新:
類型在存儲過程中聲明。 我嘗試通過指定架構、包名稱來添加參數,如下所示: in.addValue("p_a", new SqlArrayValue(a), Types.ARRAY, "SCHEMANAME.PACKAENAME.VARCHAR_ARRAY");
Oracle 版本:11.2.0.3.0 (11g)
@Lukas Eder 在評論中提到只有 12c 支持關聯數組。 我如何在 11g 中實現這一目標?
找到了解決辦法。 在傳遞它們之前,必須將 Java 數組轉換為 Oracle 本機數組:
MapSqlParameterSource inParams = new MapSqlParameterSource();
try {
DataSource ds = jdbcTemplate.getDataSource();
Connection conn = DataSourceUtils.getConnection(ds);
OracleConnection oracleConnection = null;
if (conn.isWrapperFor(OracleConnection.class))
oracleConnection = conn.unwrap(OracleConnection.class);
ARRAY aArrayValue = oracleConnection.createARRAY("VARCHAR_ARRAY", a.toArray());
ARRAY bArray = oracleConnection.createARRAY("VARCHAR_ARRAY", b.toArray());
ARRAY cArray = oracleConnection.createARRAY("VARCHAR_ARRAY", c.toArray());
ARRAY dArray = oracleConnection.createARRAY("VARCHAR_ARRAY", d.toArray());
ARRAY eArray = oracleConnection.createARRAY("NUMBER_ARRAY", e.toArray());
ARRAY fArray = oracleConnection.createARRAY("NUMBER_ARRAY", f.toArray());
inParams.addValue("p_a", aArrayValue);
inParams.addValue("p_b", bArray);
inParams.addValue("p_c", cArray);
inParams.addValue("p_d", dArray);
inParams.addValue("p_e", eArray);
inParams.addValue("p_f", fArray);
} catch (SQLException e) {
e.printStackTrace();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.