2016-09-30 2 views
3

Ich entwickle Anwendung (Feder-Framework 2.5 - alte). Die Aufgabe besteht darin, die gespeicherte Prozedur von oracle unter Verwendung von 'org.springframework.jdbc.object.StoredProcedure'Aufruf Oracle gespeicherte Prozedur mit Spring's org.springframework.jdbc.Object.StoredProcedure

aufzurufen. Seltsames ist, dass - es compiliert, ausführt, keine Fehler wirft - und null anstelle von reellem Wert zurückgibt.

Meine Testverfahren (in einem Paket ist) wie folgt aussehen:

procedure testprocedure(input1 IN varchar2, 
    input2 IN varchar2, 
    output1 OUT VARCHAR2, 
    output2 OUT VARCHAR2) 
IS 
BEGIN 
    output1 := 'return1'; 
    output2 := 'return2'; 
END testprocedure; 

Java-Code ist:

public class TestClass extends StoredProcedure { 
public static final String input1 = "input1"; 
public static final String input2 = "input2"; 
public static final String output1 = "output1"; 
public static final String output2 = "output2"; 

public TestClass() { 
    setSql("testpackage.testprocedure"); 
    setFunction(false); 
    declareParameter(new SqlOutParameter(output1, Types.VARCHAR)); 
    declareParameter(new SqlOutParameter(output2, Types.VARCHAR)); 
    declareParameter(new SqlParameter(input1, Types.VARCHAR)); 
    declareParameter(new SqlParameter(input2, Types.VARCHAR)); 
} 

public TestReturn getTestProcedureOUTs (String pinput1, String pinput2) { 
    Map<String, Object> in = new HashMap<String, Object>(); 
    in.put(input1, pinput1); 
    in.put(input2, pinput2); 

    System.out.println("Calling " + getSql() + " with parameters: " + in); 

    Map<String, Object> res = execute(in); 
    System.out.println("output is " + res); 
    return new TestReturn((String) res.get(output1), (String) res.get(output2)); 

}} 

und die Ausgabe von stdout

output is {output2=null, output1=null} 

Ich vermute Dies ist irgendwie mit Windows-Version verbunden (Windows 10) Java-Version (1.7) Oracle-Treiber (ojdbc6.jar)

oder etwas anderes - zu offensichtlich, um es selbst zu sehen.

+0

bereits wissen die Antwort - aber lassen Sie diese für jetzt offen, für den Fall, dass jemand Quiz wie diese mag. Tipp ist hier "etwas anderes - zu offensichtlich, es zu sehen" –

+0

Wenn Sie die Antwort kennen, dann sollten Sie das als Antwort posten, es könnte anderen helfen. Nichts ist so frustrierend wie bei Google für ein Problem, zu einer SO-Frage ohne Antwort, sondern nur zu einem Kommentar des OP, den er ohne weitere Details fixiert hat. –

+0

Ich bin Sory. Danke für diesen Kommentar. Guter Punkt dort. –

Antwort

1

Reihenfolge der deklarierten Parameter ist wichtig.

Parameter sollten in derselben Reihenfolge deklariert werden, in der sie in der Oracle-Prozedur oder -Funktion angezeigt werden.

In meinem Fall hatte ich diese Parameter Deklaration in der Klasse Konstruktor neu zu ordnen und sie so:

public TestClass() { 
    setSql("testpackage.testprocedure"); 
    setFunction(false); 
    declareParameter(new SqlParameter(input1, Types.VARCHAR)); 
    declareParameter(new SqlParameter(input2, Types.VARCHAR)); 
    declareParameter(new SqlOutParameter(output1, Types.VARCHAR)); 
    declareParameter(new SqlOutParameter(output2, Types.VARCHAR)); 
} 

Und dieses Verhalten wird im Frühjahr Referenzrahmen beschrieben:

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/object/StoredProcedure.html

Verwandte Themen