Eclipselink PL/SQL Parameternamen werden ignoriert

Robertop

Bekanntes Mitglied
Hallo allerseits,

wir arbeiten gerade daran, eine alte Server Application, die noch auf Eclipse basiert, zu einer Springboot-Anwendung "umzubauen". Im Prinzip funktioniert alles ganz gut, nur das manche PL/SQL Aufrufe teilweise falsche Ergebnisse oder sogar Exceptions zurückliefern. Nach allem, was wir bisher debuggt haben, sieht es so aus, als wäre das Problem, dass die Parameternamen nicht mehr richtig übergeben werden, sodass nur die Reihenfolge der übergebenen Parameter zählt. An mehreren Stellen, wo der Fehler schon aufgetreten ist, war es deshalb möglich, den Fehler dadurch zu beseitigen, dass wir die Reihenfolge im Javacode an die Reihenfolge der Parameter im DB-Package angepasst haben.

Es gibt aber auch Stellen, wo ein Aufruf zum Beispiel nicht funktioniert, weil die Funktion im Datenbankpackage überladen ist und sich die Parameter nur durch den Namen unterscheiden. Eine von diesen Stellen wirft zum Beispiel diesen Fehler:
Code:
ORA-06550: Zeile 1, Spalte 14:
PLS-00307: Zu viele Deklarationen von 'CHECK_PERSON' entsprechen diesem Aufruf
ORA-06550: Zeile 1, Spalte 7:
PL/SQL: Statement ignored

Error Code: 6550
Call: {CALL ? := PCK_FIRMA.CHECK_PERSON(?, ?, ?, ?)}
    bind => [=> FUNCTION_RESULT, Elvis, Presley, Graceland, USA]
Query: ValueReadQuery()
Zum Hinzufügen der Parameter verwenden wir die Funkion StoredProcedureCall#addNamedArgument:
Code:
storedProcedureCall.addNamedArgument("pi_vorname", "pi_vorname", String.class);
storedProcedureCall.addNamedArgument("pi_nachname", "pi_nachname", String.class);
storedProcedureCall.addNamedArgument("pi_ort", "pi_ort", String.class);
storedProcedureCall.addNamedArgument("pi_land", "pi_land", String.class);
storedProcedureCall.setResult("FUNCTION_RESULT", String.class);

Weil sich wie gesagt bei dem generellen Aufbau der Abfragen nicht viel verändert hat, habe ich das Gefühl, dass der Fehler eher etwas damit zu tun hat, dass wir mit dem neuen Server auch eine neue Version von Eclipselink (3.0.2) und damit auch von Jakarta.Persistence (3.0.0, früher javax.persistence) verwenden.
Gibt es da vielleicht irgendwelche Parameter, die man zusätzlich Setzen muss, damit das Übergeben von Parameternamen funktioniert? Oder hat sich irgendwas an den neuen Versionen verändert, dasss es gar nicht mehr untersützt wird?

Mir ist in der Dokumentation vom StoredProcedureCall aufgefallen, dass es eine ganze Menge Überladungen von "addNamedArgument" gibt (https://www.eclipse.org/eclipselink/api/2.6/org/eclipse/persistence/queries/StoredProcedureCall.html). Könnte es etwas dait zu tun haben?
 

Robertop

Bekanntes Mitglied
Nur mal der Vollständigkeit halber unsere bisherige Lösung zu dem Problem mit den PL/SQL Calls aus Java:

Nach einigem Recherchieren und Rumprobieren haben wir rausgefunden, dass die Namen bei den Argumenten wieder berücksichtigt werden, wenn man anstatt der Klassen StoredFunctionCall und StoredProcedureCall die Klassen PLSQLStoredFunctionCall und PLSQLStoredProcedureCall verwendet und anstatt der direkten Aufrufe von "addNamedArgument" die Argumente-Liste im Call selbst mit neuen Objekten vom Typ PLSQLargument füllt.

Der größte Unterschied, den wir jetzt beachten mussten, ist, dass man bei der Instanzierung von PLSQLargument keine Java-Klassen mehr angeben kann, sondern stattdessen ein "DatabaseType" erwartet wird. Hierfür haben wir diese praktische Liste im Internet gefunden:
 

Robertop

Bekanntes Mitglied
Im Prinzip ist das unsere Mittelschicht. Die eine Seite kommuniziert über Eclipselink mit der Datenbank und die andere Seite über RemoteProcedureCalls mit den verschiedenen Clients. Das ist aber alles nicht mehr so ganz der Stand der Technik, von daher ist es denke ich nicht mehr allzu wichtig, das alles zu kennen. 😄 Wir sind wie gesagt auch dabei, das alles auf aktuellere Technik umzustellen.

Das fertige Product wird dann beim bauen keine Exe-Datei, sondern eine WAR-Datei, die man dann wie üblich auf einem Tomcat laufen lassen kann.
 

Ähnliche Java Themen

Neue Themen


Oben