16

SpringのJdbcTemplateクラスとStoredProcedureクラスを使用しています。ストアドプロシージャクラスを機能させるのに問題があります。

Oracleデータベースにストアドプロシージャがあります。その署名は

CREATE OR REPLACE PROCEDURE PRC_GET_USERS_BY_SECTION
(user_cursor OUT Pkg_Types.cursor_type
 , section_option_in IN Varchar2
 , section_in IN Varchar2) AS ....

どこ

TYPE cursor_type IS REF CURSOR;

oracleプロシージャから情報を取得するために、次のストアドプロシージャクラスを作成しました

    private class MyStoredProcedure extends StoredProcedure 
{
    public MyStoredProcedure(JdbcTemplate argJdbcTemplate) 
    {
        super(argJdbcTemplate, "PRC_GET_USERS_BY_SECTION");
        declareParameter(new SqlOutParameter("output", OracleTypes.CURSOR));
        declareParameter(new SqlParameter("input1", Types.VARCHAR));
        declareParameter(new SqlParameter("input2", Types.VARCHAR));
        compile();          
    }


    public Map<String, Object> execute() {

        Map<String, Object> inParams = new HashMap<String, Object>();
        inParams.put("input1", "BG");
        inParams.put("input2", "FE");
        Map output = execute(inParams);
        return output;
    }
}

DAOクラスの1つのメソッドでこれを呼び出しています

    public List<String> getUserListFromProcedure() throws BatchManagerException
{
    MyStoredProcedure sp = new MyStoredProcedure( this.jdbcTemplate );
    Map<String, Object> result = new HashMap<String, Object>();
    try
    {
        result = sp.execute();
    }

    catch( DataAccessException dae) 
    {

    }
    System.out.println(result.size());
    return null;
}

ただし、マップのサイズは常に0であるため、何も返されません。私の入力基準に一致する行がデータベースにあることを知っています。java.sql.CallableStatementまた、オラクルのストアドプロシージャと対話するために使用されるコードが機能していたので、プロシージャは適切です。OraceleTypes.CURSORSpringのストアドプロシージャと混合するのは間違っていますか?他に何を使用できますか?私も試しましたがSqlReturnResultSet、それもうまくいきませんでした。

4

2 に答える 2

6

ここでの問題は、ストアドプロシージャを実行するOracleの方法がJDBCに準拠していないことです。OracleのSPは、OUTパラメータまたはカーソルである戻り値を介して結果セットデータを返します。これらは特別に処理する必要があります。つまり、JDBCに準拠していることを前提としたSpringのJDBCのものは使用できず、自分で使用する必要があります。

実際には、これはJdbcTemplateandを使用する必要があることを意味しますCallableStatementCallback。これは、理想的に必要なものよりもはるかに多くの手動JDBCコーディングを意味しますが、これを回避する方法はまだ見つかりません。

少し余談ですが、JDBC仕様は、Sybase(および関連付けによりSQL Server)の方法に厳密に準拠するように作成されていると思います。これは、JDBCでのストアドプロシージャの処理方法が非常に適しているためです。システム(およびOracleのシステムへの適合性が低い)。

于 2010-01-28T12:24:34.987 に答える
4

CURSORであるoutparamを宣言しているときにRowMapperを渡さない場合、問題は単純です。Springは{}空のカーソルを返します。

 declareParameter(new SqlOutParameter("output", OracleTypes.CURSOR)); - returns empty {}
 declareParameter(new SqlOutParameter("output", OracleTypes.CURSOR, new ApplicationMapper()); - returns result

ここで、ApplicationMapperは、RowMapperを実装するカスタムマッパーです。

于 2012-03-23T11:55:37.807 に答える