1

私は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)
4

1 に答える 1

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} =」でインライン化する必要があります。

于 2013-07-15T15:47:21.383 に答える