【发布时间】:2018-01-25 22:06:07
【问题描述】:
问题描述: 我正在尝试通过 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)
我错过了什么?!
提前感谢您的帮助
【问题讨论】:
-
您的程序似乎不接受整数作为输入值,一定有比
setInt更相关的方法。 -
什么是 MAP_VARCHAR 类型?
-
MAP_VARCHAR 是自定义类型,它将保存 VARCHAR 表并由 VARCHAR 索引。即 item('Madrid'):= 'Real Madrid'