2009-05-14 7 views
7

私は自分のプロジェクトにSpring永続性フレームワークを使用しています。 このフレームワークからoracle関数またはストアドプロシージャを呼び出したいとします。バネ・パーシスタンス・フレームワークを使用してOracleファンクションまたはストアド・プロシージャをコールする方法は?

どのように私はこれを達成することができます提案することができます。

* oracle関数と*ストアドプロシージャの両方のソリューションを提供してください。

ありがとうございました。あなたはJdbcTemplateに言及されていると仮定すると、

+0

春は永続化フレームワークを持っていますか?あなたはSpringのJdbcTemplateを参照していますか?または休止状態ですか? –

+0

私はDPTKを使って永続フレームワークとSpringのクエリファクトリを作成しました。現在、oracle関数またはストアド・プロシージャを既存の機能を使用してコールしたいと考えています。これをソートするのに役立ちます。 –

+0

DPTKはIBM製品のようです: –

答えて

32

jdbcTemplate.execute(
    new CallableStatementCreator() { 
     public CallableStatement createCallableStatement(Connection con) throws SQLException{ 
      CallableStatement cs = con.prepareCall("{call MY_STORED_PROCEDURE(?, ?, ?)}"); 
      cs.setInt(1, ...); // first argument 
      cs.setInt(2, ...); // second argument 
      cs.setInt(3, ...); // third argument 
      return cs; 
     } 
    }, 
    new CallableStatementCallback() { 
     public Object doInCallableStatement(CallableStatement cs) throws SQLException{ 
      cs.execute(); 
      return null; // Whatever is returned here is returned from the jdbcTemplate.execute method 
     } 
    } 
); 

関数を呼び出すには、ほぼ同じです:春のOracle関数を呼び出すの

jdbcTemplate.execute(
    new CallableStatementCreator() { 
     public CallableStatement createCallableStatement(Connection con) { 
      CallableStatement cs = con.prepareCall("{? = call MY_FUNCTION(?, ?, ?)}"); 
      cs.registerOutParameter(1, Types.INTEGER); // or whatever type your function returns. 
      // Set your arguments 
      cs.setInt(2, ...); // first argument 
      cs.setInt(3, ...); // second argument 
      cs.setInt(4, ...); // third argument 
      return cs; 
     } 
    }, 
    new CallableStatementCallback { 
     public Object doInCallableStatement(CallableStatement cs) { 
      cs.execute(); 
      int result = cs.getInt(1); 
      return result; // Whatever is returned here is returned from the jdbcTemplate.execute method 
     } 
    } 
); 
+0

ここで私たちはSPを呼び出していますが、Oracle Functionをどのように呼び出すことができますか?私はJdbcTemplateを参照していません。DPTKを使用して永続性フレームワークを取り返します。 –

+0

2番目の例は関数を呼び出しています。残念ながら、私はDPTKに精通していません。それはウェブサイトを持っていますか? –

+0

大丈夫、私はこれを私のコードで実装しようとします...うまくいくと思っています。アダムに感謝します。結果を知らせます。 –

17

簡単な方法は、

public class MyStoredProcedure extends StoredProcedure{ 
    private static final String SQL = "package.function"; 

    public MyStoredProcedure(DataSource ds){ 
     super(ds,SQL); 
     declareParameter(new SqlOutParameter("param_out",Types.NUMERIC)); 
     declareParameter(new SqlParameter("param_in",Types.NUMERIC)); 
     setFunction(true);//you must set this as it distinguishes it from a sproc 
     compile(); 
    } 

    public String execute(Long rdsId){ 
     Map in = new HashMap(); 
     in.put("param_in",rdsId); 
     Map out = execute(in); 
     if(!out.isEmpty()) 
      return out.get("param_out").toString(); 
     else 
      return null; 
    } 
} 
以下のようにStoredProcedureをサブクラス化されます

これをこのように呼び出す

@Autowired DataSource ds; 
MyStoredProcedure sp = new MyStoredProcedure(ds); 
String i = sp.execute(1l); 

ここで使用されるOracle関数は数値パラメータを取り、数値パラメータを返します。私の意見で

+0

私はSQLコードが次のようになっていることを理解しています: '{:param_out = call schema.package.MY_FUNCTION(:param_in)}' – mmoossen

+0

私の最後のコメントは間違っています。プロシージャ/ファンクションで定義されているパラメータ名と一致するように、SQL定数には 'schema.package.MY_FUNCTION'のようなプロシージャ/ファンクション名とJava ** HAVE **のパラメータ名のみが含まれていなければなりません。 – mmoossen

0

これは最も簡単なアプローチの一つである:

public class ServRepository { 

    private JdbcTemplate jdbcTemplate; 
    private SimpleJdbcCall functionGetServerErrors; 

    @Autowired 
    public void setDataSource(DataSource dataSource) { 
     this.jdbcTemplate = new JdbcTemplate(dataSource); 
     JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 
     jdbcTemplate.setResultsMapCaseInsensitive(true); 
     this.functionGetServerErrors = new SimpleJdbcCall(jdbcTemplate).withFunctionName("THIS_IS_YOUR_DB_FUNCTION_NAME").withSchemaName("OPTIONAL_SCHEMA_NAME"); 
    } 

     public String callYourFunction(int parameterOne, int parameterTwo) { 
      SqlParameterSource in = new MapSqlParameterSource().addValue("DB_FUNCTION_INCOMING_PARAMETER_ONE", parameterOne).addValue("DB_FUNCTION_INCOMING_PARAMETER_TWO", parameterTwo); 
      return functionGetServerErrors.executeFunction(String.class, in); 
     } 
} 
関連する問題