用于获取Oracle中自定义记录类型列表的MyBatis映射

用于获取Oracle中自定义记录类型列表的MyBatis映射,oracle,mybatis,Oracle,Mybatis,我们必须获取存储过程返回的Oracle自定义记录类型列表,而mybatis映射一直困扰着我们 如果您有使用mybatis实现的任何此类案例,任何人都可以共享示例代码/映射吗 包装 create or replace package p1 as TYPE T1 IS RECORD (P_OBJECT_NAME VARCHAR2(80) , p_object_status VARCHAR2(25)) ; TYPE t2 IS TABLE OF t1 index by BINARY_INTEGER;

我们必须获取存储过程返回的Oracle自定义记录类型列表,而mybatis映射一直困扰着我们

如果您有使用mybatis实现的任何此类案例,任何人都可以共享示例代码/映射吗

包装

create or replace
package p1 as
TYPE T1 IS RECORD
(P_OBJECT_NAME VARCHAR2(80) ,
p_object_status VARCHAR2(25)) ;
TYPE t2 IS TABLE OF t1 index by BINARY_INTEGER;
procedure data_collection_append(t out t2);
procedure data_collection_extract;
end;
包结构

create or replace
PACKAGE BODY P1 AS
PROCEDURE DATA_COLLECTION_APPEND(t OUT t2) AS
cursor c1 is select object_name,status from user_objects where rownum = 1;
c c1%rowtype;
i number:=0;
begin
  --t := t2() ;
  open c1;
  loop
    fetch c1 into c;
    EXIT WHEN C1%NOTFOUND;
    dbms_output.put_line(c.object_name||'==>'||c.status);
    T(I).P_OBJECT_NAME:=C.OBJECT_NAME;
    t(i).p_object_status:=c.status;
    i:=i+1;
  end loop; 
end;
procedure data_collection_extract as
t t2;
begin
  data_collection_append(t);
  for i in t.first..t.last
  LOOP
   dbms_output.put_line(t(i).p_object_name||'==>'||t(i).p_object_status);
  end loop; 
end;
END;
映射

    <select id="getLearnerMap" parameterType="Detail" statementType="CALLABLE">
    DECLARE
        v_custom_record p1.T2;

    BEGIN
        v_custom_record := p1.data_collection_append();
        #{objectName, javaType=String, jdbcType=VARCHAR, mode=OUT} := v_custom_record.P_OBJECT_NAME;

    END;
</select>
错误-->T1中未定义标识的“p_对象_名称”


有人能给我一个解决方案吗?

如下更改映射器

<resultMap type="detail" id="myResultMap"  >
        <result property="objectNamee" column="P_OBJECT_NAME" />
        <result property="objectStatus" column="p_object_status" />
</resultMap>

<select id="getLearnerMap" parameterType="spInOut" statementType="CALLABLE">

 {call p1.data_collection_append(#{objList, jdbcType=CURSOR, mode=OUT, resultMap=myResultMap, javaType=java.sql.ResultSet})}

</select>

下面是一个完整的简单示例

DB端 创建自定义类型

PACKAGE KP_EMP_PCK AS

  type empType is ref cursor;

END KP_EMP_PCK;
创建一个存储过程

create or replace PROCEDURE KPLISTEMP
( empList OUT kp_emp_pck.empType
) AS
BEGIN
  open empList for select empid, fname, lname,address from kpemployee order by fname;
END KPLISTEMP;

Java端


创建域类

public class User {

    private String fName;
    private String company;
    private int age;
    private int salary;
    //getter Setter
}

为螺旋输出创建域

public class SpInOut {

        private Object empList;
       //getter setting follows
    }
映射器接口

public interface EmployeeMapper {

    void getEmployees(SpInOut param);

}
映射器xml文件

<mapper namespace="com.kp.swasthik.db.oracle.persistence.EmployeeMapper">

    <resultMap type="employee" id="empResultMap"  >
        <id property="empId" column="EMPID" />
        <result property="fName" column="FNAME" />
        <result property="lName" column="LNAME" />
        <result property="address" column="ADDRESS"  />
    </resultMap>

    <select id="getEmployees"  statementType="CALLABLE" parameterType="spInOut" >
        {call kplistemp(#{empList, jdbcType=CURSOR, mode=OUT, resultMap=empResultMap, javaType=java.sql.ResultSet})}
    </select>
</mapper>

{调用kpListMP(#{empList,jdbcType=CURSOR,mode=OUT,resultMap=empResultMap,javaType=java.sql.ResultSet})}
最后是服务类

public class EmployeeServiceImpl implements EmployeeService {

    @Autowired
    EmployeeMapper mapper;

    @Override
    public List<Employee> getEmps() {
        try{
            SpInOut data= new SpInOut();
            mapper.getEmployees(data);
            return (List<Employee>) data.getEmpList();
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }

}
公共类EmployeeServiceImpl实现EmployeeService{
@自动连线
雇主制图员;
@凌驾
公共列表getEmps(){
试一试{
输出数据=新输出();
mapper.getEmployees(数据);
return(List)data.getEmpList();
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
}
<mapper namespace="com.kp.swasthik.db.oracle.persistence.EmployeeMapper">

    <resultMap type="employee" id="empResultMap"  >
        <id property="empId" column="EMPID" />
        <result property="fName" column="FNAME" />
        <result property="lName" column="LNAME" />
        <result property="address" column="ADDRESS"  />
    </resultMap>

    <select id="getEmployees"  statementType="CALLABLE" parameterType="spInOut" >
        {call kplistemp(#{empList, jdbcType=CURSOR, mode=OUT, resultMap=empResultMap, javaType=java.sql.ResultSet})}
    </select>
</mapper>
public class EmployeeServiceImpl implements EmployeeService {

    @Autowired
    EmployeeMapper mapper;

    @Override
    public List<Employee> getEmps() {
        try{
            SpInOut data= new SpInOut();
            mapper.getEmployees(data);
            return (List<Employee>) data.getEmpList();
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }

}