【发布时间】:2011-05-25 06:21:16
【问题描述】:
在我的数据库接口库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 类发生命名冲突。一个蹩脚的解决方案是在类名中添加一个索引,例如FAuthorExists2、FAuthorExists3。另一个蹩脚的解决方案是从参数名称/类型直接生成某种哈希值(或值本身)到类名中,例如FAuthorExistsVARCHAR2、FAuthorExistsVARCHAR2VARCHAR2。出于显而易见的原因,这两种解决方案都是不可取的。
有没有人有这个问题的简单解决方案?或者可能是一个更好的整体设计理念,不会产生此类函数名称重载问题?
感谢任何反馈!
【问题讨论】:
标签: java stored-procedures code-generation packages jooq