将数据集从 Oracle PL/SQL 传递到 Java 的适当方法
Posted
技术标签:
【中文标题】将数据集从 Oracle PL/SQL 传递到 Java 的适当方法【英文标题】:Appropriate way to pass a dataset to Java from Oracle PL/SQL 【发布时间】:2018-02-19 13:38:48 【问题描述】:我需要通过 JDBC 将数据集从 Oracle 传递到 Java。
如何更好地组织它以使一切正常运行,并且便于 Java 开发人员和 PL/SQL 开发人员在发生更改(例如表列类型)时维护代码?
我看到了这样的变种:
通过存储过程传递 sys_refcursor,在 Java 中期望某些字段具有某种类型的数据。
传递一个强引用游标,在 Java 中执行相同的操作,在第 1 项中,但在 PL/SQL 包中有类型描述。
通过SQL“表”类型,在架构级别描述。如果我理解正确,显然在 Java 中它可以以某种方式应用于对象。问题是在这些类型中,不可能使用列类型 - Column_Name%TYPE 来处理字段。
在 PL/SQL 包“对象/记录表”类型中进行,并使用 JPublisher 来处理它 - JPublisher 显然将其转换为SQL 类型。我不清楚这是如何实现的,以及当列的数据类型发生变化时,对于相同的情况需要做什么。
使用 流水线函数 代替光标(这对于这样的任务是否有意义?)。
选择什么?或者可能是别的什么,不是从这些点出发?
附:抱歉英语不好。
【问题讨论】:
如果想为 DB 和 java 开发人员提供方便和通用的方式,请使用sys_refcursor
。在 jdbc 中,sys_refcursor
的处理与普通查询完全相同。 sys_refcursor = ResultSet
.
答案是,视情况而定。这些选项都不适合所有情况。如果有一个总是最好的解决方案,那将是唯一的解决方案。
【参考方案1】:
我不确定我是否正确理解了你的问题,但我认为你很困惑。
您描述的变体是在服务器端执行 Java 包的方式(例如,当您拥有带有应用程序服务器的数据库并希望在其上执行带有数据库数据的 java 包时)。
但是,如果您考虑 JDBC,那么我想您想制作一些可以与数据库一起使用的 java-app。这样您就不必使用 sys_refcursor
的一些子集,例如 table of object / record
。 JDBC 提供了使用简单 SQL 处理数据集的功能。您应该以用户身份(通过 JDBC)连接到数据库并执行 sql 查询。之后,您可以从结果集中获取任何数据。
示例:Connection example via JDBCExecute select after connection
所以你的问题的答案取决于你的目标。
【讨论】:
感谢您的回答。但是连接 Java 服务器的用户将无权从表或视图中进行选择 @archjkee,只需在 DB 中提供用户的GRANT
。如果没有授权,您也无法使用子类型。
我们的数据库架构师说我们不会授予任何模式对象的授权,除了在包上执行的授权(可能加上对类型、过程的授权)
但是您已经写过您想使用像 sys_refcursors 这样的子类型,它基于对表的选择。例如,您必须获得授权才能执行选择。我的意思是这个细节。正如我所说,您问题的答案取决于您的目标。
我们有 以上是关于将数据集从 Oracle PL/SQL 传递到 Java 的适当方法的主要内容,如果未能解决你的问题,请参考以下文章
将oracle.sql.ARRAY传递给PL / SQL过程时设置时区