Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm thế nào để gọi một thủ tục được lưu trữ với con trỏ ref làm tham số đầu ra bằng cách sử dụng Spring?

Đây là thứ tôi tổng hợp lại dựa trên câu hỏi về StackOverflow này tài liệu 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;
    }
}

Nếu thủ tục được lưu trữ của bạn nằm trong một lược đồ khác hoặc trong một gói, bạn sẽ cần điều chỉnh tên thủ tục được lưu trữ ở trên. Ngoài ra, bạn sẽ cần chỉ định một trình liên kết hàng để sử dụng thay cho SomeRowMapper .

Để gọi nó:

    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

Ngoài ra, bạn có thể sử dụng 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");

Nếu quy trình được lưu trữ nằm trong một gói, bạn sẽ cần thêm một dòng

            .withCatalogName("PACKAGE_NAME")

để thiết lập jdbcCall . Tương tự, nếu nó nằm trong một giản đồ khác, bạn sẽ cần thêm

            .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. Làm cách nào tốt nhất để tôi có thể tạo lại cơ sở dữ liệu Oracle?

  2. SQL Challenge / Puzzle:Đưa ra một dấu vết ngăn xếp - Làm thế nào để tìm phần tử trên cùng tại mỗi thời điểm?

  3. Làm cách nào để kết nối với Oracle DB từ .NET?

  4. Văn bản tìm kiếm Oracle với các ký tự không phải tiếng Anh

  5. Hàm NVL2 () trong Oracle