我想在执行function时从java访问包中定义的数据类型。请帮助我。
包装和功能:
create or replace package types as
TYPE name_array IS VARRAY(100000) OF VARCHAR2(200);
end types;
create or replace function test_pack1 return types.name_array as
names types.name_array := types.name_array();
begin
for emp in (Select state from test where test_ID BETWEEN 1 AND 120000) loop
names.extend;
names(names.count) := emp.state;
end loop;
return names;
end test_pack1;
java代码
cstmt = (OracleCallableStatement) con.prepareCall("begin ? :=test_pack1; end;");
cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAME_ARRAY");
cstmt.execute();
在上面我在第二行遇到错误。 错误信息如下: java.sql.SQLException:无效的名称模式:xyz.NAME_ARRAY
函数在Oracle中成功执行。但是当我们尝试从java执行时抛出异常。
答案 0 :(得分:2)
较新版本的Oracle(自12c版本1开始)声称支持包内的类型(因此可以通过JDBC访问它们)。
所有PL / SQL包类型都映射到系统范围的唯一名称,JDBC可以使用它来检索服务器端类型元数据。名称采用以下形式:
[SCHEMA.]<PACKAGE>.<TYPE>
从这里开始:http://docs.oracle.com/cd/E16655_01/java.121/e17657/apxref.htm#CHEIIJCC
答案 1 :(得分:1)
您必须为此目的使用SQL类型,而不是PL / SQL类型,因此您需要定义PL / SQL之外的类型(即在架构级别,而不是包级别):
CREATE OR REPLACE TYPE NAME_ARRAY AS VARRAY(100000) OF VARCHAR2(200);
并在您的函数中使用它
create or replace function test_pack1 return name_array as
names name_array := name_array();
...
答案 2 :(得分:0)
为了使其工作,不能在包中定义数组类型,只要方便这样做。 Oracle JDBC驱动程序无法以这种方式“查看”包类型(这不仅适用于数组,而且适用于您可能希望通过JDBC调用返回的所有自定义类型)。
您需要将数组定义为架构级别类型,之后此类代码应该能够正常工作。