mysql数据库转oracle数据库
mysql->oracle
前言
今天的任务是把用
mysql
数据库编写的程序转成oracle
,这也是我第一次用oracle
可谓是错误百出啊。下载oracle
?NO在公司我们不需要本地下载oracle
,(如果你是想自己学习当我没说,不魔法下载很慢,有时间我会写一篇系统性的文章写oracle
的运用),当我下载完oracle
本地数据库看收到怀疑的眼神我悟了,只需要下载一个可视化界面我们远程连接他的数据库就好了(这里我使用的是Oracle SQL Developer这里附上下载地址)。哈哈第一次嘛,难免难免,作为拥有bug
系统的我习以为常,不会就查,再不会就问,没有解决不了的的问题!
1.oracle的maven
需要什么版本可以自己搜索
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.11.0.0</version>
</dependency>
<!-
如果不加会报下面的错误
Cause: java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK
-->
<dependency>
<groupId>com.oracle.database.nls</groupId>
<artifactId>orai18n</artifactId>
<version>19.11.0.0</version>
</dependency>
2.oracle的application.yml
配置
喜欢用
application.properties
的兄弟可以自己去转换
spring:
datasource:
# 请看3.2
# SID
#url: jdbc:oracle:thin:@127.0.0.1:6666:ocrl
# 服务名
url: jdbc:oracle:thin:@127.0.0.1:6666/ocrl
username: username # 根据实际填写
password: password # 根据实际填写
# 请看3.1
# 老ojdbc8以前
# driver-class-name: oracle.jdbc.driver.OracleDriver
# 新
driver-class-name: oracle.jdbc.OracleDriver
max-idle: 10
max-wait: 10000
min-idle: 5
initial-size: 5
3.报错解决
3.1Registered driver with driverClassName=oracle.jdbc.driver.OracleDriver was not found, trying direct instantiation.
这个是一个警告,不处理不影响运行,我大抵是有点代码洁癖
出现原因:这个警告是我在网上看oracle配置时按照广大网友的推荐cv,成功警告。主要原因是
ojdbc
的版本问题
# 老版本使用ojdbc8以下,当然我没咋尝试有小伙伴感兴趣可以出个各个版本测试,一点要记得@我
driver-class-name: oracle.jdbc.driver.OracleDriver
# 新版本使用
driver-class-name: oracle.jdbc.OracleDriver
3.2HikariPool-1 - Exception during pool initialization.并且java.sql.SQLException: Listener refused the connection with the following error:ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
出现原因:yml的
url
配置有问题可以打开你的数据库属性看看你的连接方式是
SID
还是用服务名
#SID方式
url: jdbc:oracle:thin:@127.0.0.1:6666:ocrl
#服务名方式
url: jdbc:oracle:thin:@127.0.0.1:6666/ocrl
3.3Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束
这个错误出现在
sql
语句中,可以查看一下你的mapper
中的sql
语句最后是不是加了分号,在oracle
中测试加分号的也能运行但是写在代码中就不能运行了,去掉即可
3.4Cause: java.sql.SQLException: 无效的列类型: 1111,cause by:{}
插入时由于我加了两个字段导致,前端少传导致,解决方法①修改前端,②通过if判断是否为空,③如果确定要插入空数据,需要在启动类中加入下面的内容详情可见这篇文章
/*************对于是ORACLE 数据库的 mybatis必须增加如下的配置*********Start */
@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);
}
}
/*************对于是ORACLE 数据库的 mybatis必须增加如下的配置*********End */
3.5Cause: java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
这个问题出现在字段属性上,在
mysql
中对于特殊的关键字我们会加一个反单引号`进行区分,但是他在oracle
中没有这种操作,可以在oracle
中运行一下在放到mapper.xml
中
3.6Cause: java.sql.SQLSyntaxErrorException: ORA-01745: 无效的主机/绑定变量名
我是在插入语句出现的这个,最后排查发现在value中少写了一个
,
逗号
3.7Cause: java.sql.SQLSyntaxErrorException: ORA-00909: 参数个数无效
少些或多写参数、少加或多加连接符号(比如
,
或者and
)