Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да извикате съхранена процедура с ref курсор като изходен параметър с помощта на Spring?

Ето нещо, което събрах въз основа на този въпрос на 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Дата и час на Oracle във VB.net

  2. Как да накарам по-стара версия на OracleClient да работи локално с .NET?

  3. Проблем със съхранената процедура на Oracle inout параметър – Разбрах решението – Печатна грешка

  4. ArrayList итерира същите данни

  5. как да промените състоянието на блока, за да вмъкнете в 10g с помощта на бутон за задействане