【问题标题】:Java- PLSQL- Call Table of records from javaJava-PLSQL-来自java的记录调用表
【发布时间】:2014-10-04 21:09:53
【问题描述】:

PLSQL 包过程声明

TYPE custom_type IS TABLE OF single_rec_type;

 TYPE single_rec_type IS RECORD(
 //id, name etc
 )

问题:

但是 custom_type 没有直接的 Java 类型表示 [如 OracleTypes.CLOBOracleTypes.CURSOR] 因为 custom_type 是 PLSQL 类型而不是 SQL 类型。

当我用谷歌搜索时,我遇到了以下两个选项: 为了表示它,

(1) 从我们可以从 java 绑定的过程(或包装 PLSQL 函数)创建一个 SQL TYPE。 参考:java - passing array in oracle stored procedure

(2) 将输出参数注册到我们的类型中,并使用 SQLData 对象来表示一条记录。 参考:Howto get a table as a out parameter in oracle

callableStatement.registerOutParameter(8, OracleTypes.ARRAY, "custom_type");

执行此操作时,我收到错误:

java.sql.SQLException: invalid name pattern: MYDB_OWNER.custom_type
    at oracle.jdbc.oracore.OracleTypeADT.initMetadata(OracleTypeADT.java:554)
    at oracle.jdbc.oracore.OracleTypeADT.init(OracleTypeADT.java:471)

一个建议是在模式中声明 custom_type TYPE,而不是在包中声明。 或通过创建公共同义词并给予资助。

问题 - 关于第二种方法,在架构级别声明任何自定义类型是否正确?

【问题讨论】:

    标签: java plsql


    【解决方案1】:

    是的,这是唯一有效的方法。我按照第二种方法中提到的链接 Howto get a table as a out parameter in oracle

    它奏效了。包级别更改包括 (1) 在架构级别声明 custom_typesingle_rec_type [作为全局,不在包内] 和 (2) 将 IS RECORD 替换为 AS OBJECT

    除了链接中提到的内容之外,Java 代码发生了变化,包括在 map.put("SINGLE_REC_TYPE", Class.forName("com.example.SRecord")); 中给出类的完整名称

    要注意的另一件事是,在该示例中,它提到了stream.readString();。如果您阅读 API,它会说 '读取流中的下一个属性并将其作为 Java 编程语言中的字符串返回。' 。所以如果你在对象内部有三个属性,那么像这样使用该方法三次

    id = stream.readString();
    name = stream.readString();
    designation = stream.readString();
    

    那篇文章中很好地提到了另一点;关于对象内部属性的数据类型。如果存在类型不匹配,则会出现内部表示错误。

    例如:正确的方法:

    SRecord.java

    public String id; \\varchar in plsql procedure
    public String name; \\varchar in plsql procedure
    

    【讨论】:

      猜你喜欢
      • 2015-03-09
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      • 2017-07-26
      相关资源
      最近更新 更多