问题是这样的,我创了一个包,
create or replace package TEST_PKG is
  TYPE TESTTYPE IS TABLE OF VARCHAR2 (128) INDEX BY BINARY_INTEGER;--包里面的类型
  procedure TEST(data in testType, message out varchar2);--简单的存储过程
end TEST_PKG;
create or replace package body TEST_PKG is
  procedure TEST(data in TESTTYPE, message out varchar2)
  is
  begin
       message:='this is a message';
  end test;
end TEST_PKG;
现在要在java中调用这个包中的procedure TEST(data in TESTTYPE, message out varchar2):
代码如下:
conn=java.sql.DriverManager.getConnection(sConnStr,"test","test");
stmt=(OracleCallableStatement)conn.prepareCall("{call test_pkg.test(?,?)}");
String[] t_tags={"aaaaa","bbbbb"};
ArrayDescriptor ad=ArrayDescriptor.createDescriptor("TEST_PKG.TESTTYPE", conn);//这里就出错了,说找不到TEST_PKG.TESTTYPE
oracle.sql.ARRAY tagsArray=new ARRAY(ad,conn,t_tags);
stmt.setArray(1,tagsArray);
stmt.registerOutParameter(2, OracleTypes.VARCHAR);
stmt.execute();
System.out.println(stmt.getString(2));
就在我创建ArrayDescriptor的时候,程序就报错了,说找不到TEST_PKG.TESTTYPE。我曾经把这段字符串换成"TEST_PKG_TESTTYPE"和"TEST.TEST_PKG.TESTTYPE"和"TEST_TEST_PKG_TESTTYPE"或者"TEST.TESTTYPE",但是每次都是说无法找到这个类型。
请大家帮我看看这个问题啊,到底要怎么样才能访问到包里面的类型呢?我访问包里面的存储过程是完全没有问题的,但是涉及到用包里面的类型作为参数就没办法了。
谢谢了~

解决方案 »

  1.   

    你把TESTTYPE定义到type里看看效果怎么样
      

  2.   

    直接这样接收呢?
    String sql="{call test_pkg.test(?,?)}"; 
    OracleCallableStatement stmt = (OracleCallableStatement) conn.prepareCall(sql); 
    stmt.registerOutParameter(1,OracleTypes.ARRAY,"TEST_PKG.TESTTYPE"); 
      

  3.   

    为什么一定要定义在包里面呢,定义在外面也可以啊,只要不冲突的话
    类型定义在包外面我做过,是好用的也许你疏忽了这个:
    你在java代码里访问的时候,不是定义了一个连接吗,这个连接是以哪个用户登入的呢?
    和你包的所有者是不是同一个用户呢?
    加个用户名前缀试试?
      

  4.   

    定义到type里面可以啊,但是存储过程是客户提供的,我们没法改呢
      

  5.   

    但是我要用的是一个input啊...
      

  6.   

    这个连接码我试过了,加了用户前缀也不行呢。谢谢上面几位了。我也问了一下一些前辈,他们说应该是Oracle的jdbc不支持pl/sql,也就是暂时来说是没办法访问pl/sql 里面的package里面的type了。
      

  7.   

    用这类的方法就可以出入in参数
    例如:stmt.setInt(2,参数);