java.sql.SQLException:从 jdbc 执行包级别类型的过程时列类型无效

汉森

问题描述:我试图通过java代码调用存储在我的数据库中的过程。我想调用的过程有一个类型为“MAP_VARCHAR”的参数(我在下面的包中将其定义为类型)。

现在,我试图从我的 java 代码执行这个过程,但是,传递参数给 java.sql.SQLException。

SQL 包向您展示我是如何创建我的 SQL 过程和类型的

--------------------------------------------------------
--   Package Body TEST_PACKAGET
--------------------------------------------------------

  CREATE OR REPLACE EDITIONABLE PACKAGE BODY "TEST_PACKAGE" AS

  PROCEDURE PerformersRole(P_Performer_Map MAP_VARCHAR) AS
  BEGIN

        DBMS_OUTPUT.PUT_LINE('Hello ' || P_Performer_Map('Engineer'));

  END PerformersRole;

END TEST_PACKAGE;

/
--------------------------------------------------------
--   Package TEST_PACKAGE
--------------------------------------------------------

  CREATE OR REPLACE EDITIONABLE PACKAGE "TEST_PACKAGE" AS 

  /* TODO enter package declarations (types, exceptions, methods etc) here */ 
  TYPE MAP_VARCHAR IS TABLE OF VARCHAR(100) INDEX BY VARCHAR(100);

  PROCEDURE PerformersRole(P_Performer_Map MAP_VARCHAR);
END TEST_PACKAGE;

/

我的Java代码

    public void executeProcedure(){

       CallableStatement statement = null;
        try {

/// Oracle Connection code should be here 
             Connection connection = connectionManager.createConnection();


            Hashtable newMap = new Hashtable();

            newMap.put("Engineer", "Hanson");
            newMap.put("Assistant", "Alice Kim");
            newMap.put("Supervisor", "James MaCoy");


            StringBuffer procedure = new StringBuffer("{call TEST_PACKAGE.PerformersRole(?) }");
            statement = connection.prepareCall(procedure.toString());
            statement.setInt(1, newMap );

            statement.execute();
        } catch (Exception ex) {


        } 

} 

我在执行 java 代码时收到的错误是

java.sql.SQLException: Invalid column type
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:8761)
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:8259)
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:9012)
    at oracle.jdbc.driver.OracleCallableStatement.setObject(OracleCallableStatement.java:4983)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:230)

我缺少什么?!

提前感谢您的帮助

汉森

好的,在 Arkadiusz Łukasiewicz 发表评论后,我花了一些时间试图弄清楚如何克服这个问题,而且由于他没有提供任何提及这一点的官方文件,我进行了快速研究,看来他的说法是合法的。

有两种方法可以解决从 Java 访问 SQL 包级别类型的问题:

方法#1
Panser 在以下 URL
[ https://stackoverflow.com/a/25989632/8477836][1] 中提供的答案

您所需要的只是构建 SQL DECLARE ... BEGIN ... END 块,然后从您的 java 中执行它。

方法# 2
我插入了级别类型 (MAP_VARCHAR) 值我想在我的程序中在单独的表中传递,然后在我的 SQL 包中,我创建了使用游标从我创建的表中检索这些值的函数,并将返回的值存储到我的具有 (MAP_VARCHAR) 类型的局部变量

负责存储 MAP_VARCHAR 值的函数

    FUNCTION GET_MAP_VARCHAR(P_PROCESS_ID NUMBER)
    RETURN MAP_VARCHAR IS
      LV_MAP_VARCHAR MAP_VARCHAR;
      LV_MAP_VARCHAR_TABLE_ROW EPAD_WF_RESD_PRFM_RLE%ROWTYPE;

        CURSOR C_GET_MAP_VARCHAR_ROWIS 
            SELECT * FROM TEST T
            WHERE T.TEST = P_PROCESS_ID;

  BEGIN

      FOR R_GET_MAP_VARCHAR_ROWIN C_GET_MAP_VARCHAR_ROWLOOP
        LV_MAP_VARCHAR(R_GET_MAP_VARCHAR_ROW .ROLE):= R_GET_MAP_VARCHAR_ROW.NAME;
      END LOOP;

    RETURN LV_MAP_VARCHAR;

  END GET_MAP_VARCHAR

我的新 SQL 过程应如下所示:

  CREATE OR REPLACE EDITIONABLE PACKAGE BODY "TEST_PACKAGE" AS

  PROCEDURE PerformersRole(P_ID Number) AS

    LV_Performer_Map MAP_VARCHAR
  BEGIN
    LV_Performer_Map MAP_VARCHAR= GET_MAP_VARCHAR(P_PROCESS_ID NUMBER);

        DBMS_OUTPUT.PUT_LINE('Hello ' || LV_Performer_Map('Engineer'));

  END PerformersRole;

希望这能帮助任何在从 Java 访问 SQL 包类型时遇到问题的人

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

soapui jdbc:java.sql.SQLException:数据类型不匹配。(2015-02-04)

错误:java.sql.SqlException:无效的列类型

日期格式错误java.sql.SQLException:无效的列类型

java.sql.SQLException:列数与第1行jdbc的值数不匹配

java.sql.SQLException:在org.hsqldb.jdbc.JDBCUtil.sqlException处关闭SQL语句

通过Java执行SQL查询时,获取错误为“ java.sql.SQLException:无效的列索引”

从SQL Server存储过程的Java提高的SQLException?

值java.sql.SQLException:无效的列名

Hibernate java.sql.SQLException:无效的列名

java.sql.SQLException:未找到适合jdbc:sqlserver://的驱动程序-基于Java的Azure函数

java.sql.SQLException:无法从ClassLoader加载类:com.mysql.jdbc.Driver

Tomcat:java.sql.SQLException:无法从ClassLoader加载类:com.mysql.jdbc.Driver

为什么我的JDBC SQLite数据库中的“ @”附近出现java.sql.SQLException?

如何解决 java.sql.SQLException: 在数据库与 JDBC API 的集成中?

无法获取JDBC连接;嵌套异常为java.sql.SQLException:null

原因:java.sql.SQLException:不支持JDBC4 Connection.isValid()方法

java.sql.SQLException: 找不到适合 jdbc:mysql://localhost/WORLD 的驱动程序

java.sql.SQLException:无法加载类:com.mysql.jdbc.Driver

无法获得JDBC连接。嵌套异常是java.sql.SQLException-junit eclipse

java.sql.SQLException:找不到适合jdbc:hive:// localhost:10000 / default的驱动程序

Groovy java.sql.SQLException:找不到适合 jdbc:sqlserver:// 的驱动程序

java.sql.SQLException:找不到适用于jdbc:microsoft:sqlserver的驱动程序

org.springframework.jdbc.CannotGetJdbcConnectionException,嵌套的异常是java.sql.SQLException

java.sql.SQLException:尽管具有最新的JDBC,但系统变量'query_cache_size'未知

Scala错误:java.sql.SQLException:找不到适用于jdbc:calcite的驱动程序:

java.sql.SQLException:找不到适合 jdbc://localhost:3306/twitch 的驱动程序

java.sql.SQLException:找不到适用于jdbc:sqlite的驱动程序

我正面临java.sql.SQLException:找不到适合jdbc:ucanaccess:// C:/的驱动程序

“java.sql.SQLException:未选择数据库”与 MySQL JDBC