2010-12-29 10 views
0

私は単純なはずだと思う仕事を担当しています。私は、OracleLinkから多数のストアド・プロシージャを呼び出すEclipseLinkを使用してEJB 3プロジェクトを作成しました。データソースを正しく設定しました。単純なストアドプロシージャと関数を(パラメータなしでカーソルを返す)接続して実行できます。しかし、私は現在、パラメータを持つストアドプロシージャを実行することができません。EclipseLink - Oracleストアドプロシージャコール初心者問題

私は参考としてhttp://wiki.eclipse.org/Using_Basic_Query_API_(ELUGとしてEclipseLink wikiを使用しています。

コードは次のとおりです。私は、データベース自体へのアクセスがないよう

は、データベースのマニュアルに基づいて
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]); 
} 

、プロシージャは、指定された名前のパラメータの3 VARCHARをとります。私はその後、アクティブなセッションでexecuteQueryメソッドを呼び出しますが、 "間違った型または引数の数"というエラーを受け取ります。私は間違って何をしていますか?どんな助けもありがとうございます。

EDIT:ストアドプロシージャの署名は、ドキュメントごとに、次のとおりです。

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

多くの感謝!

+0

をより正確に私のポストを編集しました答え: – LaGrandMere

答えて

0

コードには、call.addNamedArgumentValue(pair[0], pair[1]);が奇妙に聞こえます。

代わりにこれを行う必要はありませんか?

call.addNamedArgument(procedureParameterName, argumentFieldName, argumentType); 

これにより、ストアドプロシージャのパラメータと使用するargs間のマッピングが有効になります。例えば

は、あなたのために、それが与える:

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

あなたがこの保つ:あなたのストアドプロシージャを呼び出すためにその後

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

を:

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

ありがとう、しかし、いいえ、幸運。私はcall.addNamedArgumentValue(ペア[0]、ペア[1])と思います。 session.executeQuery()への引数として引数のリストを渡し、値をパラメータにバインドするのと同じことを行います。型が指定されていない場合、型の既定値はStringになり、プロシージャのパラメータ名と引数のフィールド名には同じ名前を使用します。エラーと生成されたコードも同じです...私は迷っています。ストアドプロシージャの署名を含めるように質問を編集しました。 – Alessandro