问题描述:我试图通过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] 删除。
我来说两句