Oracle包和Java包之间的映射

前端之家收集整理的这篇文章主要介绍了Oracle包和Java包之间的映射前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的数据库接口库 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.由于显而易见的原因,这两种解决方

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

任何反馈意见!

您的getReturnValue函数可以在调用时确定要调用的重载函数,具体取决于已设置的输入参数的数量 – 但我认为如果您坚持使用setParam1而不是setName,它将变得更简单

猜你在找的Oracle相关文章