从java访问oracle数据类型

时间:2012-01-03 11:23:39

标签: java oracle

我想在执行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执行时抛出异常。

3 个答案:

答案 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调用返回的所有自定义类型)。

您需要将数组定义为架构级别类型,之后此类代码应该能够正常工作。