如何在 Java 中映射 TYPE TABLE OF VARCHAR2(5)? [英] How to map TYPE TABLE OF VARCHAR2(5) in java?

查看:108
本文介绍了如何在 Java 中映射 TYPE TABLE OF VARCHAR2(5)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有以下签名的程序.

I have a procedure with the signature below.

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

自定义类型定义如下.

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中注册输出参数?

Can anyone please help, how to register the out parameters in java?

我尝试了以下方法,但没有成功.

I have tried the following, but no luck.

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

我们已检查架构是否可以访问过程,并且它是在主架构中定义的.我们还尝试为此包创建公共同义词.还是不行..

We have checked that the schema has access to the procedure and it is defined in the master schema. We also have tried by creating public synonym for this package. Still not working..

推荐答案

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

The title of your question is misleading. table of <TYPE> and table of <TYPE> index by <TYPE> are two very different data types. First is called nested table and second is called associative array in Oracle (PL/)SQL parlance.

主要问题是:

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

解决了第一个问题,例如在如何将数组从Java返回到PL/SQL?(即使调用方向不同,问题也相同).

The first issue is addressed e.g. in How to return an array from Java to PL/SQL? (the issue is the same even the call direction is different).

进一步阅读:

这篇关于如何在 Java 中映射 TYPE TABLE OF VARCHAR2(5)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆