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;

a4486cd9aa791e8f1d0991da6ccae4a9.png

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")

@Email

@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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐