В моей библиотеке интерфейса базы данных 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
.Ни одно из решений не желательно по очевидным причинам.
У кого-нибудь есть простое решение этой проблемы?Или, может быть, идея лучшего общего дизайна, который не вызвал бы таких проблем с перегрузкой имен функций?
Любые отзывы приветствуются!