前言:

因为工作方向开始向数据处理转变,所以开始遇到很多数据库相关问题,很是花了些时间处理,所以觉得有必要记录一下。

正文:

年后开始使用kettle开发ETL流程。所谓的ETL,即(Extraction-Transformation-Loading),属于构建数仓必不可少的环节。这个以后再说。本次主要要谈Oracle这个数据库。前几年,因为自己所处的项目一直在用informix,加上自己对于数据库兴趣不大,所以对于最近接触的Oracle很是新鲜。Oracle应该说目前使用的频率还是蛮高的。虽然现在ke-value库很火热,但是关系数据库作为大学时就一直主教的库类型,其实还是占主要地位。尤其是一些历史比较悠久的项目,更可能用Oracle这样的关系数据库。另外这种项目如果是处于一个大的系统群内,随着业务不断累积,肯定会有数据处理的需求出现,这个时候构建数仓和数据集市我觉得已经是必然的一步了。下面谈谈最近遇到的Oracle相关问题。

1.Oracle的字段类型 CLOB与VARCHAR2 ,NUMBER和INT

CLOB可以看成C-LOB,LOB是Large Object(大字段)的意思。与C-LOB相对应的是B_CLOB。如果是存储二进制的大文件可以使用BCLOB。通常我们使用VARCHAR2存储字符类型。

但是它的最大长度是4000。所以如果需要大于4000字节长度的文本存储,可以是CLOB。

INT是NUMBER的子集,代表Number(22)的整数。另外 Number(x,y)写法中,y代表小数点后多少位,x代表长度。

2.报错 表名不存在 ;存在非法字符

报表名不存在,是因为建表时命名使用了"",并且表名使用了小写。在mybatis处理sql时,它会把表名转成大写字母,所以执行语句报表名不存在。解决办法就是重新建表后表名命名大写。

报存在非法字符,是因为sql语句后面使用了;号,而在使用mybatis执行语句时不需要加上这个;号。这是和你在plsqlldev里执行语句是不一样的。

3.mybtatis 连接Oracle 批量更新数据不生效,一直返回-1

这是因为如果按照如下配置,是需要另外在sqlsession执行时增加commit的操作。网上也有说可以通过设置defaultExecutorType 为simple解决,实际尝试仍是不行。

 

 

 

 最后找到的解决办法是换种批量执行sql的写法,如下

<update id="updateBatch" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" separator=";"
  open="" close="">
  update REGION_CODE set
    CODE=#{item.Code,jdbcType=VARCHAR},
    NAME=#{item.Name,jdbcType=VARCHAR}
    where ID = #{item.id,jdbcType=DECIMAL}
</foreach>
</update>
这样直接报错,因为Mybatis映射文件中的sql语句不允许 ; 符号。按照可行的case when处理方式,Mybatis映射文件书写方式如下:
<update id="updateBatch" parameterType="java.util.List">
  update REGION_CODE set
    CODE=
  <foreach collection="list" item="item" index="index" separator=" " open="case ID" close="end">
      when #{item.id,jdbcType=DECIMAL} then #{item.Code,jdbcType=VARCHAR}
  </foreach>
  ,NAME=
  <foreach collection="list" item="item" index="index" separator=" " open="case ID" close="end">
      when #{item.id,jdbcType=DECIMAL} then #{item.Name,jdbcType=VARCHAR}
  </foreach>
  where ID in
  <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
      #{item.id,jdbcType=DECIMAL}
  </foreach>
</update>
 
4.执行update语句时报错:不支持的特性: getMetaData 的异常
这时需要手动把如下配置设置成false。通过注解@Options也可以设置。
use-generated-keys: true

 5.给整型主键设置自增

首先 设置新的序列 

Create Sequence

如下

create sequence S_S_DEPART
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
nocache;

定义好后 就在插入时使用该序列

例如 emp_sequence.CURRVAL 
emp_sequence.NEXTVAL

CURRVAL=返回 sequence的当前值 
NEXTVAL=增加sequence的值,然后返回 sequence 值