oracle 如何在Spring Data JPA调用存储过程时传入数组

3pmvbmvn  于 2023-05-06  发布在  Oracle
关注(0)|答案(2)|浏览(150)

我遵循这个example使用Spring Data JPA调用存储过程。其思想是创建一个实体并像这样定义namedstoredprocedure。

@Entity
@Table(name = "TRFTABLE")
@NamedStoredProcedureQuery(
        name = "processFmTrf", 
        procedureName = "FM_TRF_UTIL.process_fm_trf",
        parameters = {
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "i_trf_list", type = String.class),
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "i_source_system", type = String.class)
        }
)
public class TrfTable implements Serializable{
}

对于带有原始类型的输入参数,这是非常简单的,例如。String.class.然而,我的存储过程的一个输入是一个数组。我知道如何使用CallableStatement调用stored proc来处理数组,如下所示:

Connection con = getConnection();
    OracleConnection oraCon = con.unwrap(OracleConnection.class);
    // fileArray predefined.
    Array array = oraCon.createARRAY("VARCHAR2_TAB_T", fileArray); 
    CallableStatement stmt = con.prepareCall("{call FILE_TRANSFER_AUDIT_UTIL.update_file_queue_id(?,?,?,?,?,?)}");
    stmt.setArray(1, array);

看起来必须建立DB连接才能将数组传递给存储过程。如何使用NamedStoredProcedure为我的实体类完成此操作?

7eumitmz

7eumitmz1#

这应该可以工作:

Array array = oraCon.createARRAY("VARCHAR2_TAB_T", fileArray); 
StoredProcedureQuery query = entityManager.createNamedStoredProcedureQuery("processFmTrf")
            .setParameter("i_trf_list", array)
            .setParameter("i_source_system", sourceValue);
ryevplcw

ryevplcw2#

NamedStoredProcedureQuery不适用于传入数组,因为它需要数据库连接。我所做的是从entitymanager创建一个会话,并在doWork方法中使用数组调用存储过程:

EntityManager em = Persistence.createEntityManagerFactory("DEV").createEntityManager();
    Session session = em.unwrap( Session.class );
    final String[] trfArray = trfs.toArray(new String[trfs.size()]);
    final String src = source;

    session.doWork( new Work(){
        public void execute(Connection conn) throws SQLException {
            CallableStatement stmt = null;               
            OracleConnection oraCon = conn.unwrap(OracleConnection.class);
            Array array = oraCon.createARRAY("VARCHAR2_TAB_T", trfArray);
            stmt = conn.prepareCall("{? = call FM_TRF_UTIL.process_fm_trf(?,?)}");
            stmt.registerOutParameter(1, Types.INTEGER);
            stmt.setArray(2, array);
            stmt.setString(3, src);
            stmt.execute();
            returnVal = stmt.getInt(1);
        }
    });

相关问题