Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana cara memanggil prosedur tersimpan dengan kursor ref sebagai parameter output menggunakan Spring?

Inilah sesuatu yang saya kumpulkan berdasarkan pertanyaan StackOverflow ini dan dokumentasi Musim Semi :

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;
    }
}

Jika prosedur tersimpan Anda berada dalam skema lain atau dalam paket, Anda harus menyesuaikan nama prosedur tersimpan di atas. Selain itu, Anda harus menentukan pembuat peta baris yang akan digunakan sebagai pengganti SomeRowMapper .

Untuk menyebutnya:

    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

Atau, Anda dapat menggunakan 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");

Jika prosedur tersimpan ada dalam satu paket, Anda harus menambahkan baris

            .withCatalogName("PACKAGE_NAME")

ke pengaturan jdbcCall . Demikian pula, jika dalam skema yang berbeda, Anda harus menambahkan

            .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 LIMIT setara dengan n,m

  2. Bagaimana cara melepaskan partisi dari tabel dan melampirkannya ke yang lain di Oracle?

  3. Oracle Database, pernyataan Pembaruan SQL tidak akan berfungsi (OLEDB)

  4. Apa penyebab kesalahan ORA-38104 pada penggabungan SQL?

  5. SQL Query untuk Menghitung () beberapa tabel