2016-09-30 20 views
3

私はアプリケーション(Spring Framework 2.5 - 古いもの)を開発中です。このタスクは、 'org.springframework.jdbc.object.StoredProcedure'を使用してoracleのストアド・プロシージャを呼び出すことです。Springのorg.springframework.jdbc.object.StoredProcedureを使用してOracleストアドプロシージャを呼び出す

奇妙なことは、コンパイルして実行し、エラーをスローせず、実際の値の代わりにnullを返すことです。

のように私のテスト手順は、(それがパッケージ内にある)になります。

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

}} 

とstdoutからの出力は、私は疑う

output is {output2=null, output1=null} 

です:

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

JavaコードがありますこれはどういうわけかWindows版(Windows 10)に接続されています javaバージョン(1.7) オラクルのドライバ(ojdbc6.jar)

またはそれ以外のもの - 自分で見ることは明らかです。

+0

は既に知っています答え - 誰かがこのようなクイズを好きな場合に備えて、これを今のところ開いたままにしておきます。ヒントはここにある "何か他のもの - それを見て分かりやすい" –

+0

あなたが答えを知っているなら、あなたは答えとしてそれが他人を助けるかもしれないと投稿するべきです。 Googleにとっては問題のためにイライラするものではなく、答えがなくてもSOの質問を得ることはできませんが、詳細な説明なしに修正したOPのコメントだけです。 –

+0

私はソリです。このコメントをありがとう。そこに良い点。 –

答えて

1

宣言されたパラメータの順序が重要です。

パラメータは、oracleプロシージャまたはファンクションに表示される順序と同じ順序で宣言する必要があります。

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)); 
} 

そして、この動作は、Springフレームワークの参考文献に記載されています:

は、私の場合は、クラスのコンストラクタで、これらのパラメータの宣言を並べ替えると、このようにそれらを入れていた

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

関連する問題