Frage

In meiner Datenbank Schnittstelle Bibliothek jOOQ , würde Ich mag die Unterstützung für Oracle hinzuzufügen (oder DB2 usw.) Pakete . Ich habe bereits gespeicherte Prozedur / Funktion Unterstützung implementiert, wo jedes gespeicherte Objekt als generierte Java-Klasse modelliert wird. Zum Beispiel wird diese gespeicherte Funktion

CREATE FUNCTION f_author_exists (author_name VARCHAR2) RETURNS NUMBER;

wird eine Klasse erzeugen, wie diese verwendet werden können (beachten Sie, gibt es auch viele bequeme Methoden, dieses Beispiel zeigt nur das allgemeine Design):

// 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();

Der Grund, warum ich eine Zuordnung gewählt SQL-Funktion -> Java Class ist, weil gespeicherte Prozeduren erlauben komplexe Rückgabewerte (mehrere OUT oder IN OUT-Parameter), dass ich möchte in der Lage zu holen nacheinander nach Aufruf der Prozedur:

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

Nun ist diese Konstruktion funktioniert gut mit den gespeicherten Funktionen / Prozeduren, wobei Überlastung ist nicht möglich. Innerhalb von Oracle (oder DB2 ist) Pakete jedoch kann ich mehrere Funktionen mit dem gleichen Namen, wie

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;

Wenn ich eine Klasse pro Funktion (oder Prozedur) zu erzeugen, muss ich Auseinandersetzungen mit mehreren FAuthorExists Java-Klassen zu benennen. Eine lahme Lösung ist, einen Index zu den Klassennamen, wie FAuthorExists2, FAuthorExists3 hinzuzufügen. Eine andere Lösung ist, lame irgendeine Art von Hash-Wert (oder der Wert selbst) von den Parameternamen / types direkt in den Klassennamen, wie FAuthorExistsVARCHAR2, FAuthorExistsVARCHAR2VARCHAR2 zu erzeugen. Weder Lösung ist aus offensichtlichen Gründen wünschenswert.

Hat jemand eine einfache Lösung für dieses Problem? Oder vielleicht eine Idee von einer besseren Gesamtgestaltung, die nicht solche Funktionsnamen Überlastung Probleme erzeugen?

geschätzt Jedes Feedback!

War es hilfreich?

Lösung 2

fand ich keinen anderen gangbaren Weg, dieses Problem zu lösen, als einen „Überlastung Index“ auf generierten Klassen verwenden. Daher das Paket

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;

Wird diese Klassen erzeugen:

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

Andere Ideen würde nur weil neue Konflikte bei Codegenerierung Zeit oder zur Laufzeit.

UPDATE : Beachten Sie, diese Lösung scheint auch den einzigen Griff Situationen wie diese richtig:

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;

Wie es scheint, ist diese Art von Überlastung ist möglich, in PL / SQL, auch.

Andere Tipps

Ihre getReturnValue Funktion zum Aufrufzeitpunkt bestimmen kann, welche Funktion überlastete je zu nennen, wie viele Eingangsparameter gesetzt wurde - aber ich denke, es wird am Ende wird einfacher, wenn Sie so etwas wie setParam1 kleben, anstatt setName

Sie könnten überwinden die Grenzen der Überlastung, indem sie eindeutige Namen für jede Funktion. Dies würde auch die Lesbarkeit des Codes verbessern (das ist ein Grund warum Golang nicht über Überlastung ). Zum Beispiel f_author_name_exists, f_author_name_country_exists.

Ein andere Art und Weise, die die Java-Klassen erschweren wird, ist zur Laufzeit entscheiden, dass das Verfahren Anruf, basierend auf dem überlasteten Java-Konstruktor verwendet wurde oder die wurden Setter verwendet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top