Dans ma bibliothèque d'interfaçage de base de données jOOQ, je souhaite ajouter un support pour les packages Oracle (ou DB2, etc.). J'ai déjà implémenté la procédure stockée/support de fonction où chaque objet stocké est modélisé comme une classe Java générée. Par exemple, cette fonction stockéeMappage entre packages Oracle et Java
CREATE FUNCTION f_author_exists (author_name VARCHAR2) RETURNS NUMBER;
va générer une classe qui peut être utilisé comme ceci (note, il y a aussi beaucoup de méthodes pratiques, cet exemple montre que la conception générale):
// 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();
La raison pour laquelle j'ai choisi un mappage La fonction SQL ->Classe Java est que les procédures stockées autorisent des valeurs de retour complexes (plusieurs paramètres OUT ou IN OUT) que je veux pouvoir extraire une par une après l'appel de la procédure:
p.getOutParam1();
p.getOutParam2();
Maintenant, cette conception fonctionne très bien avec des fonctions/procédures stockées, où la surcharge est impossible. Au sein de packages d'Oracle (ou DB2 pour), mais je peux avoir plusieurs fonctions avec le même nom, comme
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;
Quand je produis une classe par fonction (ou procédure), je vais avoir des affrontements de noms avec plusieurs FAuthorExists
classes Java . Une solution boiteuse consiste à ajouter un index au nom de classe, tel que FAuthorExists2
, FAuthorExists3
. Une autre solution boiteuse consiste à générer une sorte de valeur de hachage (ou la valeur elle-même) à partir des noms/types de paramètres directement dans le nom de classe, tel que FAuthorExistsVARCHAR2
, FAuthorExistsVARCHAR2VARCHAR2
. Aucune solution n'est souhaitable pour des raisons évidentes.
Quelqu'un at-il une solution simple à ce problème? Ou peut-être une idée d'une meilleure conception globale qui ne produirait pas de tels problèmes de surcharge de nom de fonction?
Tout commentaire apprécié!
La méthode 'execute()' effectue l'appel réel. La méthode est appelée 'setName()' à cause de l'argument de la fonction 'name'. J'ai corrigé cela dans l'exemple, pour le rendre plus clair. Votre idée n'est pas mauvaise. Bien que, le problème est si vous avez la surcharge de nom de fonction avec des ensembles d'arguments très distincts, alors il peut devenir déroutant de découvrir, quelle combinaison d'arguments est possible. Mais avec les méthodes de commodité, cela pourrait effectivement fonctionner! +1 pour l'idée de déterminer l'appel correct à l'exécution –
@Lukas correspondant à des types d'arguments plutôt que des noms était ce que je voulais dire par ma suggestion - je pensais que ce pourrait être plus simple. Je pense que ce serait possible en principe cependant. –
Il est facile de trouver une bonne implémentation sur comment appeler la fonction en fonction des noms/types/positions des arguments. Mais la partie difficile est de rendre le code généré facile à utiliser pour les développeurs. C'est pourquoi j'utilise le nom de l'argument dans les méthodes générées –