我正在尝试将关联数组返回给java但面临异常。我正在使用专有的持久层,因此我无法发布我的代码,但在Google上搜索时,我发现的内容与我的内容完全相似:
===========================
create or replace PACKAGE testLookAside as
type AssocArry IS TABLE OF varchar(30) INDEX BY VARCHAR(30);
function lookupMasterData return AssocArry;
end testLookAside;
/
create or replace PACKAGE BODY testLookAside as
function lookupMasterData_ return AssocArry as
retval AssocArry;
begin
retval('1') := '1';
retval('2') := '2';
retval('3') := '3';
retval('4') := '4';
return retval;
end lookupMasterData_;
/
function lookupMasterData return AssocArry as
retVal AssocArry;
begin
retVal := lookupMasterData_();
return retVal;
end lookupMasterData;
end testLookAside;
Statement s = null;;
Class.forName("oracle.jdbc.driver.OracleDriver");
// set up connection here....
s=con.createStatement();
//String query = "begin ? := DEVELOPER.testLookAside.lookupMasterData(); end;";
String query = "{? = call DEVELOPER.testLookAside.lookupMasterData()}";
OracleCallableStatement stmt = (OracleCallableStatement)con.prepareCall(query);
// register the type of the out param - an Oracle specific type
stmt.registerIndexTableOutParameter(1, 30, OracleTypes.VARCHAR, 30);
stmt.execute();
我一直遇到错误:
Exception in thread "main" java.sql.SQLException: ORA-06550: line 1, column 13:
PLS-00382: expression is of wrong type
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
有人能解释从jdbc访问该数据类型的正确方法吗?
另外,如果我的自定义类型使用数字和二进制整数,我该怎么办:
type AssocArry IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
我试图在过去的一周内解决这个问题并查看了许多没有结果的线程。
感谢。
答案 0 :(得分:1)
我要坚持下去,并说没有直接的方法可以从JDBC中访问声明为TABLE OF varchar(30) INDEX BY VARCHAR(30)
的数据类型。
Oracle JDBC documentation在不同的地方提到了关联数组的元素类型(即你的类型中的第一个varchar(30)
),但据我所知,它没有提到关键数据类型。此外,文档提到关联数组作为Java数组传入并返回。这使我怀疑Oracle JDBC仅支持以BINARY_INTEGER
为关键数据类型的关联数组。
因此,如果您想使用JDBC中的VARCHAR2
密钥访问PL / SQL关联数组中的数据,我建议您首先将数据转换为另一种数据类型。
但是,在您调用{{1} BINARY_INTEGER
时,我希望您编写的JDBC代码将使用OracleTypes.VARCHAR
键处理关联数组。 }}。请注意,返回的Java数组将包含与最大键值一样多的元素,因此请确保元素的最大数量(OracleTypes.NUMERIC
的第二个参数)足够大。还要确保关联数组没有负键或零键,因为JDBC驱动程序似乎也不支持这些键。
作为参考,这里是我用来获取声明为registerIndexTableOutParameter
的关联数组的代码。首先,PL / SQL包和正文:
registerIndexTableOutParameter
其次,Java类:
INDEX BY BINARY_INTEGER
当我运行Java类时,我得到以下输出:
create or replace PACKAGE testLookAside as
type AssocArry IS TABLE OF number INDEX BY binary_integer;
function lookupMasterData return AssocArry;
end testLookAside;
/
create or replace PACKAGE BODY testLookAside as
function lookupMasterData return AssocArry as
retval AssocArry;
begin
retval(2) := 1;
retval(4) := 2;
retval(7) := 3;
retval(1) := 4;
return retval;
end lookupMasterData;
end testLookAside;
/