java - Oracle 包和 Java 包之间的映射

标签 java stored-procedures code-generation package jooq

在我的数据库接口(interface)库中 jOOQ ,我想添加对 Oracle(或 DB2 等)包的支持。我已经实现了存储过程/函数支持,其中每个存储对象都被建模为生成的 Java 类。比如这个存储函数

CREATE FUNCTION f_author_exists (author_name VARCHAR2) RETURNS NUMBER;

将生成一个可以像这样使用的类(注意,还有很多方便的方法,这个例子只是展示了一般设计):

// A new "function call instance". The function needs to be instanciated
// once per call
FAuthorExists f = new FAuthorExists();

// Set the function parameters on the call instance and call it
f.setAuthorName("Paulo");
f.execute(connection);

// Fetch the result from the function call instance
BigDecimal result = f.getReturnValue();

我选择映射SQL 函数 -> Java 类 的原因是存储过程允许我想要的复杂返回值(多个 OUT 或 IN OUT 参数)调用过程后能够一一获取:

p.getOutParam1();
p.getOutParam2();

现在这种设计可以很好地处理存储函数/过程,其中重载 是不可能的。然而,在 Oracle(或 DB2)的包中,我可以有几个同名的函数,比如

CREATE PACKAGE my_package IS
  FUNCTION f_author_exists (name VARCHAR2) RETURNS NUMBER;
  FUNCTION f_author_exists (name VARCHAR2, country VARCHAR2) RETURNS NUMBER;
END my_package;

当我为每个函数(或过程)生成一个类时,我将与多个 FAuthorExists Java 类发生命名冲突。一个蹩脚的解决方案是为类名添加索引,例如FAuthorExists2FAuthorExists3。另一个蹩脚的解决方案是从参数名称/类型直接生成某种哈希值(或值本身)到类名中,例如 FAuthorExistsVARCHAR2FAuthorExistsVARCHAR2VARCHAR2。由于显而易见的原因,这两种解决方案都不可取。

有没有人有解决这个问题的简单方法?或者也许是一个更好的整体设计的想法,它不会产生这样的函数名称重载问题?

感谢任何反馈!

最佳答案

您的 getReturnValue 函数可以在调用时确定调用哪个重载函数,具体取决于已设置的输入参数数量 - 但我认为如果您坚持使用类似 setParam1 而不是 setName

关于java - Oracle 包和 Java 包之间的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4439229/

相关文章:

mysql - phpmyadmin 在创建存储过程时卡住

java - 无法从 SOAP 网络服务打印 XML 响应

java - 为什么我应该使用 Deque 而不是 Stack?

mysql - 如何加速我的 MySQL UUID v4 存储函数?

javax.xml.transform.TransformerException : java. io.FileNotFoundException:<file_name>(访问被拒绝)

mysql - 无法在mysql中创建存储过程

java - 通过 Xtend ActiveAnnotations 自动实现接口(interface)

ruby-on-rails - 将 rails 2 生成器转换为 rails 3?

java - 不包含 youtube 的 URL 的正则表达式

java - 通过 Eclipse 的 SVN - 无法运行我 checkout 的代码