sql >> データベース >  >> RDS >> Oracle

Springを使用して出力パラメータとしてrefカーソルを使用してストアドプロシージャを呼び出すにはどうすればよいですか?

    このStackOverflowの質問 およびSpringのドキュメント :

    import java.sql.Types;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.sql.DataSource;
    
    import oracle.jdbc.OracleTypes;
    import org.springframework.jdbc.core.SqlOutParameter;
    import org.springframework.jdbc.core.SqlParameter;
    import org.springframework.jdbc.object.StoredProcedure;
    
    public class SampleStoredProcedure extends StoredProcedure {
    
        public SampleStoredProcedure(DataSource dataSource) {
            super(dataSource, "PROC_NAME");
            declareParameter(new SqlParameter("param1", Types.VARCHAR));
            declareParameter(new SqlParameter("param2", Types.VARCHAR));
            declareParameter(new SqlOutParameter("results_cursor", OracleTypes.CURSOR, new SomeRowMapper()));
            compile();
        }
    
        public Map<String, Object> execute(String param1, String param2) {
            Map<String, Object> inParams = new HashMap<>();
            inParams.put("param1", param1);
            inParams.put("param2", param2);
            Map output = execute(inParams);
            return output;
        }
    }
    

    ストアドプロシージャが別のスキーマまたはパッケージにある場合は、上記のストアドプロシージャ名を調整する必要があります。また、SomeRowMapperの代わりに使用する行マッパーを指定する必要があります 。

    それを呼び出すには:

        DataSource dataSource = ... ; // get this from somewhere
        SampleStoredProcedure sp = new SampleStoredProcedure(dataSource);
        Map<String, Object> result = sp.execute("some string", "some other string");
        // Do something with 'result': in particular, result.get("results_cursor")
        // will be the list of objects returned
    

    または、SimpleJdbcCallを使用することもできます :

        DataSource dataSource = ... ; // get this from somewhere
        SimpleJdbcCall jdbcCall = new SimpleJdbcCall(dataSource);
        Map<String, Object> result =
            jdbcCall.withProcedureName("PROC_NAME")
                .declareParameters(
                        new SqlParameter("param1", Types.VARCHAR),
                        new SqlParameter("param2", Types.VARCHAR),
                        new SqlOutParameter("results_cursor", OracleTypes.CURSOR, new SomeRowMapper()))
                .execute("some string", "some other string");
    

    ストアドプロシージャがパッケージに含まれている場合は、行を追加する必要があります

                .withCatalogName("PACKAGE_NAME")
    

    jdbcCallの設定に 。同様に、別のスキーマにある場合は、追加する必要があります

                .withSchemaName("SCHEMA_NAME")
    


    1. SQLでINSERTの重複値を避ける方法は?

    2. EclipseEEのSQLテーブルにデータを挿入する

    3. PostgreSQLの時間のタイムスタンプの違い

    4. 1対多のテーブルでのユーザーのランキングのクエリ