我对mybatis很新,一直试图调用一个从mybatis返回游标的函数。 以下是一些代码段:
PL / SQL功能:
FUNCTION student_fetch(
p_id VARCHAR2,
p_usr_id VARCHAR2,
p_program_code VARCHAR2)
RETURN t_students_cursor
IS
cur t_students_cursor;
--v_cnt INT;
BEGIN
--check_student_info_permission(p_osis_id, p_usr_id, p_program_code, v_cnt);
--IF v_cnt > 0 THEN
OPEN cur FOR SELECT srec.First_Name, srec.Last_Name, srec.Middle_Initial,
XML条目:
<resultMap id="accountDetailResult" type="student">
<result property="firstName" column="First_Name" />
<result property="lastName" column="Last_Name" />
</resultMap>
<select id="getAccountDetail" parameterType="map" statementType="CALLABLE">
{ #{t_students_cursor,jdbcType=CURSOR,mode=OUT,resultMap=accountDetailResult,javaType=java.sql.ResultSet} =
call students.student_fetch(#{osisId,jdbcType=VARCHAR,mode=IN}, #{userId,jdbcType=VARCHAR,mode=IN},#{programCode,jdbcType=VARCHAR,mode=IN})}
</select>
POJO班级:
public class Student {
private String firstName;
private String lastName;
private String emailAddress;
private String daytimeTelephoneNumber;
private String id;
private String userId;
private String programCode;
映射器接口:
void getAccountDetail(@Param("map") Map<String, Object> parameter);
测试员类:
Map<String, Object> param = new HashMap<String, Object>();
param.put("p_d", "214996787");
param.put("p_usr_id", "admin");
param.put("p_program_code", null);
productServiceObj.getAccountDetail(param);
Student st = (Student)param.get("t_students_cursor");
例外:
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.NullPointerException
### The error may involve com.example.services.ProductServices.getAccountDetail-Inline
### The error occurred while setting parameters
### Cause: java.lang.NullPointerException
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:8)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:61)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:53)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:38)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:66)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:35)
at $Proxy1.getAccountDetail(Unknown Source)
at com.example.runner.AppTester.main(AppTester.java:79)
Caused by: java.lang.NullPointerException
at oracle.jdbc.driver.T4C8Oall.getNumRows(T4C8Oall.java:870)
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:960)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1168)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3390)
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4223)
答案 0 :(得分:0)
一个引人注目的调整:
#{t_students_cursor,jdbcType=CURSOR,mode=OUT,resultMap=accountDetailResult,javaType=java.sql.ResultSet} = call students.student_fetch(#{osisId,jdbcType=VARCHAR,mode=IN}, #{userId,jdbcType=VARCHAR,mode=IN},#{programCode,jdbcType=VARCHAR,mode=IN})}
是正确的方法。 “call”应该与“#{t_students_cursor,jdbcType = CURSOR,mode = OUT,resultMap = accountDetailResult,javaType = java.sql.ResultSet} =”
内联