我有一个带有下面签名的程序。
CREATE OR REPLACE PACKAGE BODY MYSCHEMA.MYPACK
AS
PROCEDURE GETBOX (DSSO_BoxNumber IN VARCHAR2,
CreateDateTime OUT tCreateDateTime,
ReceiptDateTime OUT tReceiptDateTime,
CSCBoxNumber OUT tCSCBoxNumber,
DSSOBoxNumber OUT tDSSOBoxNumber,
PackID OUT tPackID,
RequestID OUT tRequestID,
ExceptionID OUT tExceptionID,
Name OUT tName,
FolderID OUT tFolderID,
ClosedDateTime OUT tClosedDateTime,
OpenStatus OUT tOpenStatus,
RequestOpenStatus OUT tRequestOpenStatus,
RETURNED OUT tRETURNED)
...
cutom类型定义如下。
CREATE OR REPLACE PACKAGE MYSCHEMA.MYPACK
AS
TYPE tCreateDateTime is TABLE of VARCHAR2(15)
INDEX BY BINARY_INTEGER;
TYPE tReceiptDateTime is TABLE of VARCHAR2(15)
INDEX BY BINARY_INTEGER;
TYPE tCSCBoxNumber is TABLE of VARCHAR2(20)
INDEX BY BINARY_INTEGER;
TYPE tDSSOBoxNumber is TABLE of VARCHAR2(20)
INDEX BY BINARY_INTEGER;
TYPE tPackID is TABLE of VARCHAR2(20)
INDEX BY BINARY_INTEGER;
TYPE tRequestID is TABLE of VARCHAR2(20)
INDEX BY BINARY_INTEGER;
TYPE tExceptionID is TABLE of VARCHAR2(20)
...
有谁可以帮忙,如何在java中注册out参数?
我试过以下,但没有运气。
cs.setString(1, "XYZ123");
cs.registerOutParameter(2, Types.ARRAY,"MYSCHEMA.MYPACK.tCreateDateTime");
...
获得以下错误。
java.sql.SQLException: invalid name pattern: MYSCHEMA.MYPACK.tCreateDateTime
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.oracore.OracleTypeADT.initMetadata(OracleTypeADT.java:463)
at oracle.jdbc.oracore.OracleTypeADT.init(OracleTypeADT.java:362)
at oracle.sql.ArrayDescriptor.initPickler(ArrayDescriptor.java:1756)
at oracle.sql.ArrayDescriptor.<init>(ArrayDescriptor.java:272)
...
我们检查过架构是否可以访问该过程,并且它是在主模式中定义的。我们也试过为这个包创建公共同义词。仍然没有工作..
答案 0 :(得分:2)
您的问题标题具有误导性。 table of <TYPE>
和table of <TYPE> index by <TYPE>
是两种截然不同的数据类型。第一个称为嵌套表,第二个在Oracle(PL /)SQL术语中称为关联数组。
主要问题是:
第一个问题已解决,例如在How to return an array from Java to PL/SQL?中(即使呼叫方向不同,问题也是一样)。
进一步阅读:
create type
。create type
statement 答案 1 :(得分:1)
我能够将varchar2的类型表映射到java,如下所示:
在任何PLSQL包之外创建一个新类型并授予必要的权限。
CREATE OR REPLACE TYPE STRARRAY AS TABLE OF VARCHAR2 (100);
/
GRANT all ON MYSCHEMA.STRARRAY TO MYUSER1;
/
commit;
创建一个接受/返回strarray的PLSQL函数。这是在包规范中声明的,并在包体中完整写入。虽然我声明数组是IN OUT,但在我的实现中我实际上只使用了PLSQL调用的输出。
PROCEDURE getArr(arr_var IN OUT strarray) IS
counter NUMBER := 1;
BEGIN
arr_var := new strarray();
WHILE counter <= 10 LOOP
arr_var.extend();
arr_var(counter) := 'my data string';
END LOOP;
END getArr;
在java中调用该过程。在此示例中,变量conn的数据类型为Connection,并且已经初始化。我正在针对Oracle数据库运行jdbc瘦客户端。
CallableStatement proc = null;
String sql = "{ call myPackage.getArr(?) }";
try{
proc = conn.prepareCall(sql);
proc.registerOutParameter(1, OracleTypes.Array, "MYSCHEMA.STRARRAY");
proc.execute();
Array arrOut = proc.getArray(1);
for (int num=0; num<10; num++){
System.out.println(arrOut[num]);
}finally{
proc.close();
}