sql最好不要用函数
oracle的表别名不能用as,mysql都可以
oracle只能用单引号,mysql都可以
oracle在mapper中不能写分号
oracle的concat只能连接两个字符,mysql可以连接三个
//通用写法
LOGIN_NO like CONCAT('%',CONCAT(#{loginNo},'%'))
oracle数字和字符串不能直接比较,需要转换,mysql可以直接比较
//oracle to_char
LEFT JOIN ps_objectinfo_dict b
ON to_char( a.app_id ) = b.obj_val
//oracle和mysql都可以用 CAST
LEFT JOIN ps_objectinfo_dict b
ON CAST( a.app_id AS NVARCHAR2 ( 20 ) ) = b.obj_val
oracle的casewhen语句对字符集严格匹配,mysql随便
正常是下面这样的,在mysql可以,但oracle不可以,因为STATE的类型和单引号中的数据类型不一致,会报错:ORA-12704:字符集不匹配。
CASE STATE
WHEN 'T' THEN
'待处理'
WHEN 'H' THEN
'已处理'
END
可以使用to_char 或者cast 进行转换,但为了更好的数据库兼容性,选择以下方法:
CASE
WHEN STATE = 'T' THEN
'待处理'
WHEN STATE = 'H' THEN
'已处理'
END
oracle中的DISTINCT在clob字段长度超过2000时会报错
ORA-00932: inconsistent datatypes: expected - got NCLOB
可能是oracle 11g的bug,在字段长度超过2000时,去重复查询中出现上面的问题
解决:升级oralce;重新优化表结构和字段;优化sql语句,最好避免使用DISTINCT;
oracle数据库需配置JdbcType.NULL, 默认是Other
描述:
springboot 项目mybatis plus 需要设置 jdbcTypeForNull属性,否则为null的值默认插入的值是Other
比如:使用updateById()方法,传入的实体对象有null值,这时oracle的话就会报错,因为sql的参数匹配不正确。
解决:
方法1:
application.yml
mybatis-plus:
configuration:
jdbc-type-for-null: 'null' #注意:单引号
方法2:
查看mp-starter-源码, MybatisPlusAutoConfiguration, 可以发现,第119行有一个configurationCustomizers,可以修改configuration
自定义一个,配上就完工
@Bean
public ConfigurationCustomizer configurationCustomizer(){
return new MybatisPlusCustomizers();
}
class MybatisPlusCustomizers implements ConfigurationCustomizer {
@Override
public void customize(org.apache.ibatis.session.Configuration configuration) {
configuration.setJdbcTypeForNull(JdbcType.NULL);
}
方法3:
第一步:把 可更新为空的 javabean 属性前加上注解:
@TableField(el = "username, jdbcType=VARCHAR")
@TableField(el = "email, jdbcType=VARCHAR")
private String email;
第二步: 使用updateAllColumnById方法,而不是updateById. 如:
this.baseMapper.updateAllColumnById(user);
主键自增策略
#mybatis
mybatis-plus:
global-config:
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
id-type: 2 #oracle兼容
针对大字段 text/clob插入和查询
建议在mybatis中增加标识当前数据库版本的变量DB_TYPE,拼接出不同的查询和插入sql脚本。
public static final String DB_TYPE = "MYSQL";///ORACLE
数据传输、建表
可以使用navicat的数据传输功能,少量数据还可以,大量不太行。
Tools->Data Transfer