2010-12-29 2 views
0

Ich bin verantwortlich für eine Aufgabe, die ich glaube, sollte einfach sein, aber wie ich es noch nie getan habe, habe ich einige Probleme damit. Ich habe erfolgreich ein EJB 3-Projekt mit EclipseLink erstellt, das eine Reihe gespeicherter Prozeduren aus einer Oracle-Datenbank aufrufen wird. Ich habe die Datenquelle korrekt konfiguriert, kann einfache gespeicherte Prozeduren und Funktionen verbinden und ausführen (ohne Parameter und einen Cursor zurückgeben); Ich bin jedoch derzeit nicht in der Lage, gespeicherte Prozeduren mit Parametern auszuführen.EclipseLink - Oracle Stored Procedure Anruf Neuling Problem

Ich verwende das EclipseLink Wiki als Referenz http://wiki.eclipse.org/Using_Basic_Query_API_(ELUG).

Der Code ist:

StoredProcedureCall call = new StoredProcedureCall(); 
call.setProcedureName("p_environment.startSession"); 

List<String[]> args = new ArrayList<String[]>(); 
args.add(new String[] { "user", "ae01403" }); 
args.add(new String[] { "application", "app_code" }); 
args.add(new String[] { "locale", "it_IT" }); 

for (String[] pair : args) { 
    call.addNamedArgumentValue(pair[0], pair[1]); 
} 

DataReadQuery query = new DataReadQuery(call); 
for (String[] pair : args) { 
    query.addArgument(pair[0]); 
} 

Basierend auf der Datenbankdokumentation, da ich keinen Zugriff auf die Datenbank selbst haben, die Prozedur dauert 3 VARCHAR IN-Parameter des angegebenen Namens. Ich rufe dann die executeQuery-Methode für die aktive Sitzung auf, erhalte jedoch den Fehler "Falscher Typ oder Anzahl der Argumente". Was mache ich falsch? Jede Hilfe wird geschätzt.

EDIT: Die gespeicherte Prozedur Signatur gemäß Dokumentation ist:

p_environment.startSession(as_user  IN VARCHAR2, 
          as_application IN VARCHAR2, 
          as_locale  IN VARCHAR2); 

Vielen Dank!

+0

bearbeitet meinen Beitrag mit genauer Antwort :) – LaGrandMere

Antwort

0

In Ihrem Code klingt call.addNamedArgumentValue(pair[0], pair[1]); seltsam.

Müssen Sie das nicht stattdessen tun?

call.addNamedArgument(procedureParameterName, argumentFieldName, argumentType); 

Es ermöglicht die Zuordnung zwischen der gespeicherten Prozedur Parameter und die args Sie verwenden möchten.

Zum Beispiel für Sie, es gibt:

call.addNamedArgument(procedureUserParameterName, "user", String.class); 
call.addNamedArgument(procedureUserParameterName, "application", String.class); 
call.addNamedArgument(procedureUserParameterName, "locale", String.class); 

du halten:

DataReadQuery query = new DataReadQuery(call); 
for (String[] pair : args) { 
    query.addArgument(pair[0]); 
} 

dann Ihre gespeicherte Prozedur aufzurufen:

Session session = jpaEntityManager.getActiveSession(); 
List args = new ArrayList(); 
args.add(“ae01403”); 
args.add(“app_code”); 
args.add(“it_IT”); 
List results = (List) session.executeQuery(query, args); 
+0

Danke, aber nein, kein Glück. Ich denke call.addNamedArgumentValue (pair [0], pair [1]); tut dasselbe, als eine Liste von Argumenten als Parameter an session.executeQuery() zu übergeben und Werte an Parameter zu binden. Geben Sie standardmäßig den Wert "String" ein, wenn dieser Wert nicht angegeben ist, und ich beabsichtige, denselben Namen für den Namen des Prozedurparameters und den Argumentfeldnamen zu verwenden. Der Fehler und der generierte Code waren auch gleich ... Ich bin ratlos. Ich habe die Frage bearbeitet, um die Signatur der gespeicherten Prozedur einzubeziehen. – Alessandro