如何在java中映射TYPE TABLE OF VARCHAR2(5)?

时间:2015-02-19 12:13:00

标签: java sql spring oracle plsql

我有一个带有下面签名的程序。

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)
...

我们检查过架构是否可以访问该过程,并且它是在主模式中定义的。我们也试过为这个包创建公共同义词。仍然没有工作..

2 个答案:

答案 0 :(得分:2)

您的问题标题具有误导性。 table of <TYPE>table of <TYPE> index by <TYPE>是两种截然不同的数据类型。第一个称为嵌套表,第二个在Oracle(PL /)SQL术语中称为关联数组

主要问题是:

  • 向Java揭示的PL / SQL接口中使用的集合类型需要是SQL类型,而不是PL / SQL类型
  • 关联数组不是SQL类型,而是PL / SQL类型

第一个问题已解决,例如在How to return an array from Java to PL/SQL?中(即使呼叫方向不同,问题也是一样)。

进一步阅读:

答案 1 :(得分:1)

我能够将varchar2的类型表映射到java,如下所示:

  1. 在任何PLSQL包之外创建一个新类型并授予必要的权限。

     CREATE OR REPLACE TYPE STRARRAY AS TABLE OF VARCHAR2 (100);
     /
     GRANT all ON MYSCHEMA.STRARRAY TO MYUSER1;
     /
     commit;
    
  2. 创建一个接受/返回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;
    
  3. 在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();
    }