使用Mybatis注解调用oracle函数

189 阅读1分钟

使用select XXXXX from dual

对于oracle函数,在java代码中,我们可以直接使用@Select注解进行直接调用。

@Select(" select apps.fyg_6_inv_common_pub.get_seq_num(#{p_organization_code},#{p_serial_seq},#{p_seq_length},#{p_seq_separator}) " +
        " from dual ")
String getSeqNum(Map<String,Object> map);
wipNameMap.put("p_organization_code",wipEntity.getOrganizationCode()+s);
wipNameMap.put("p_serial_seq","fyg_6_wip_job_serial_");
wipNameMap.put("p_seq_length",5);
wipNameMap.put("p_seq_separator","");
this.baseMapper.getSeqNum(wipNameMap);

直接使用select xxxxxx from dual,这种是针对get_seq_num这个函数中只存在select的plsql语句,如果里面存在且会执行update/insert/create等修改表结构或者表数据的语句(ddl,dml),那么会报类似下面错误,在java程序中也是报类似错误

ORA-14552: 在查询或 DML 中无法执行 DDL, 提交或回退
ORA-06512: 在 "APPS.FYG_6_INV_COMMON_PUB", line 622
ORA-02289: 序列不存在
ORA-06512: 在 line 1

使用call

@Options(statementType = StatementType.CALLABLE,flushCache = Options.FlushCachePolicy.TRUE,useCache = false)
@Select("{ #{result, mode=OUT, jdbcType=VARCHAR} =call apps.fyg_6_inv_common_pub.get_seq_num("
        + "#{p_organization_code,mode=IN,jdbcType=VARCHAR},"
        + "#{p_serial_seq,mode=IN,jdbcType=VARCHAR},"
        + "#{p_seq_length,mode=IN,jdbcType=INTEGER},"
        + "#{p_seq_separator,mode=IN,jdbcType=VARCHAR})}")
void getSeqNum(Map<String, Object> map);
wipNameMap.put("p_organization_code",wipEntity.getOrganizationCode()+s);
wipNameMap.put("p_serial_seq","fyg_6_wip_job_serial_");
wipNameMap.put("p_seq_length",5);
wipNameMap.put("p_seq_separator","");
this.baseMapper.getSeqNum(wipNameMap);

使用call一般都是万能的,这种可以解决@select里面调用oracle函数,而oracle函数里面涉及ddl/dml语句的,但是前提是必须使用@options注解声明statementType=StatementType.CALLABLE,表示这是一个oracle存储过程或者函数调用。