在我的数据库接口库中 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课 是因为存储过程允许我希望能够在调用该过程后能够一个人获取复杂的返回值(几个或输入参数):

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

现在,此设计可以通过存储的功能 /过程正常运行, 超载 不可能。但是

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课。 la脚的解决方案是向类名称添加索引,例如 FAuthorExists2, FAuthorExists3. 。另一个la脚解决方案是从参数名称/类型直接在className中生成某种哈希值(或值本身),例如 FAuthorExistsVARCHAR2, FAuthorExistsVARCHAR2VARCHAR2. 。出于明显的原因,这两种解决方案均不理想。

有人对这个问题有简单的解决方案吗?还是一个更好的总体设计的想法,不会产生此类功能名称过载问题?

任何反馈都赞赏!

有帮助吗?

解决方案 2

我没有其他可行的方法可以解决此问题,而是在生成的类上使用“过载索引”。因此,包裹

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;

将产生这些课程:

public class FAuthorExists1 { /* ... */ }
public class FAuthorExists2 { /* ... */ }

其他想法只会在代码生成时或运行时引起新的冲突。

更新: :请注意,该解决方案似乎也是唯一正确处理此类情况的解决方案:

CREATE PACKAGE my_package IS
  PROCEDURE f_author_exists (name VARCHAR2);
  PROCEDURE f_author_exists (name CHAR);
  PROCEDURE f_author_exists (name CHAR, country OUT VARCHAR2);
END my_package;

看来,PL/SQL也可以使用这种超载。

其他提示

您的 getReturnValue 函数可以在呼叫时间确定哪个重载函数要根据设置了多少个输入参数来调用 - 但我认为,如果您坚持使用类似的内容,它最终会变得更简单 setParam1 而不是 setName

您可以通过给出每个功能的唯一名称来克服过载的局限性。这也将提高代码的可读性(这是一个原因之一 为什么Golang没有超载)。例如f_author_name_exists,f_author_name_country_exists。

将使Java类复杂化的另一种方法是在运行时确定要拨打哪个过程的方法,该过程是根据使用了哪个过载Java构造函数或使用了哪些设置器。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top