问题是这样的,我创了一个包,
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",但是每次都是说无法找到这个类型。
请大家帮我看看这个问题啊,到底要怎么样才能访问到包里面的类型呢?我访问包里面的存储过程是完全没有问题的,但是涉及到用包里面的类型作为参数就没办法了。
谢谢了~
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",但是每次都是说无法找到这个类型。
请大家帮我看看这个问题啊,到底要怎么样才能访问到包里面的类型呢?我访问包里面的存储过程是完全没有问题的,但是涉及到用包里面的类型作为参数就没办法了。
谢谢了~
String sql="{call test_pkg.test(?,?)}";
OracleCallableStatement stmt = (OracleCallableStatement) conn.prepareCall(sql);
stmt.registerOutParameter(1,OracleTypes.ARRAY,"TEST_PKG.TESTTYPE");
类型定义在包外面我做过,是好用的也许你疏忽了这个:
你在java代码里访问的时候,不是定义了一个连接吗,这个连接是以哪个用户登入的呢?
和你包的所有者是不是同一个用户呢?
加个用户名前缀试试?
例如:stmt.setInt(2,参数);