【问题标题】:Not able to call Stored procedure contains Varchar2_table as a parameter from Java无法调用存储过程包含 Varchar2_table 作为 Java 的参数
【发布时间】: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


    【解决方案1】:

    您需要使用oracle.sql.ArrayDescriptor 来创建保存数据的oracle.sql.ARRAY。在"Spring Data JDBC Extensions" 项目中,我们在SqlArrayValue 类中处理这个问题。您可以自己实现此功能,也可以使用“Spring Data JDBC Extensions”项目提供的便利类。请参阅docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 2014-03-27
      • 2020-01-09
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多