Oracle DBMS 能否从 Java 存储过程调用返回 Java 对象?

Posted

技术标签:

【中文标题】Oracle DBMS 能否从 Java 存储过程调用返回 Java 对象?【英文标题】:Can Oracle DBMS return a Java object from a Java stored procedure call? 【发布时间】:2013-07-14 16:42:25 【问题描述】:

Oracle 数据库能否从 Java 存储过程调用的返回值中返回 Java 对象?

我想通过调用 java 存储过程来查询 Oracle 数据库并接收返回的 java 对象作为结果。这可能吗?如果是这样,有人可以举一个非常简单的例子吗?

注意:我不想在数据库中存储序列化对象。我想运行 Java 存储过程,并让这个过程返回一个 Java 对象。所以如果查询数据库,每条返回的记录都会是一个Java对象。

例如: 我希望 Java 存储过程解析存储在网络共享驱动器中的二进制文件,使用从二进制文件中提取的信息构建 Java 对象,并将此 Java 对象作为查询结果返回。

我想实现这样的目标:

 #Using Java or Python programming language
 results = execute( Select java_procedure_call(parameter) From dual);
 For java_obj in results:
     print java_obj.name
     print java_obj.city

其他信息: 我没有使用 Java EE。

提前致谢。

【问题讨论】:

这可以帮助你asktom.oracle.com/pls/asktom/… 请注意它是 Java 而不是 java 或 JAVA! 无法使用存储过程解析存储在网络驱动器中的二进制文件。 为什么不可能? 【参考方案1】:

您需要做的是,serialize 并从 Oracle 数据库表中反序列化 Java 对象。您可以使用BLOB 列类型将序列化的对象字节存储在Oracle 表中。这是一个链接,描述了如何从表中存储和检索 java 对象。

http://asktom.oracle.com/pls/apex/f?p=100:11:0::::p11_question_id:1285601748584

【讨论】:

【参考方案2】:

您可以将任何可序列化的数据存储在数据库中,从文本文件、图像到 Java 对象。这里的基本逻辑,任何数据都被序列化为字节流并存储在DB中。从数据库中获取时它们会被反序列化。如果你真的想要这个,你可以跳过我的回答。但是,将数据库字段映射到 Java 类是更好的解决方案,我的解释将朝这个方向发展。

您应该为此目的使用对象关系映射 (ORM) 框架。可以是Hibernate、JPA 或Spring JDBC Template。可以根据您的要求使用其中之一。

如果您不想使用任何框架,您基本上可以实现它。

实现用户名和密码等2个字段的结构。我假设这两个字段都是String

首先,您应该有一个模型类,它将映射到查询结果。

class Model

     private String username;
     private String password;

    //setter and getters.
 

其次,您应该实现工厂模式以从查询结果创建 Java 对象。

class BasicModelFactory


   public List<Model> getModels(ResultSet rs)
   
        List<Model> models = new ArrayList<Model>();
        while(rs.next())
        
             Model m = new Model();
             m.setUsername(rs.getString("username");
             m.setPassword(rs.getString("password");
             models.add(m); 
        
        return models;
   


【讨论】:

例如,我不使用 JEE。我最大的疑问是如何将 java 对象作为记录返回。我已经用更多信息编辑了这个问题。 如果插入时没有序列化,则无法返回Java对象。

以上是关于Oracle DBMS 能否从 Java 存储过程调用返回 Java 对象?的主要内容,如果未能解决你的问题,请参考以下文章

oracle存储过程输入参数能否为空

使用 dbms_job 在包内执行 oracle 中的存储过程

Oracle存储过程详解(引用)+补充 dbms_output包 good

执行 Java 的 Oracle 作业

Oracle 延时执行问题求指教:

oracle存储过程如何输出信息