oracle适配总结

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: oracle适配总结

背景:

原来使用的是mysql:5.7,现在需要适配oracle数据库;

项目框架:SpringBoot:2.2.11.RELEASE + MybatisPlus:3.3.2

问题总结:

1、名字长度

oracle12.1的表、字段、索引名、视图名命名长度不能超过30,12.2版本以后即可支持;

2、默认值丢失

在mysql中有默认值,迁移到oracle中没有设置默认值;

3、注意字段大小写问题

4、时间字符串格式

oracle需要使用to_date()函数转换:

TO_DATE( '2022-06-07 00:00:00', 'SYYYY-MM-DD HH24:MI:SS' )

5、order by

oracle的order by 字段不在group by中就会报错;

6、sql末尾不能加分号 ";"

7、引号、as、关键字问题:

sql语法的支持 反单引号 · 单引号 ' 双引号 " as 别名
oracle字段名 × 支持 × 支持
mysql字段名 支持 × 识别为字符串了 × 识别为字符串了 支持
oracle 字段 as 别名 × × 支持 -
mysql字段 as 别名 支持 支持 支持 -
oracle表名 × × 支持区分大小写 ×
mysql表名 支持 × × 支持
oracle表名 as 别名 - - - -
mysql表名 as 别名 支持 × × -
  • 字段名:oracle只支持单引号;mysql只支持反单引号;(设计时考虑多数据库的关键字,避免使用)

  • as字段别名:oracle和mysql都支持双引号;

  • oracle表别名不支持as的方式, 可以去掉as,直接拼接别名;(字段别名支持as);

  • 遇到的关键字,可以加单引号解决('as' 、'level' 、'uid'、 'display')

8、字段类型问题

  • CLOB、NCLOB 对应 jdcbType=“VARCHAR“ 时,插入数据没问题,但是查询数据有问题;要么把字段类型改为NVARCHAR2,要么把jdbcType改为对应数据库的类型;

  • BLOB字段类型表示二进制存储,一般用不到这种,可以修改为NVARCHAR2或者NCLOB或者CLOB;

  • 关于oracle字符串类型的介绍:https://developer.aliyun.com/article/687922

在这里插入图片描述
在这里插入图片描述

常见错误日志

(以下只代表我的处理记录,仅作参考,同一个错误提示其实可能是多种结果导致的)

ORA-01465: invalid hex number

解决:BLOB类型可以改成NCLOB

ORA-00932: inconsistent datatypes: expected - got NCLOB

解决:NCLOB类型改为NVARCHAR2,或者是添加注解:

@TableField(value = "defSSOJson",    jdbcType = JdbcType.NCLOB,    typeHandler = NClobTypeHandler.class)

ORA-00923:FROM keyword not found where expected

解决:sql查询中字段别名有关键字,需要加双引号

ORA-00933: SQL command not properly ended

解决:

  • sql末尾有分号,去掉分号即可;

  • oracle表别名不支持as的方式, 可以去掉as,直接拼接别名;(但字段别名还是支持as的)

ORA-00911: invalid character

解决:字段的反单引号替换成单引号

SQL state [99999]; error code [17068]; Invalid argument(s) in call;

解决:升级oracle驱动包(适配oracle19c版本时报的错)

<!--oracle12c使用  12.2.0.1 -->
<!--oracla19c使用  19.3.0.0 -->
<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>${oracle.version}</version>
</dependency>

Non supported character set (add orai18n.jar in your classpath): ZHS16GBK

在本地debug启动报错如下:

java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK]

解决:添加依赖

<dependency>
    <groupId>cn.easyproject</groupId>
    <artifactId>orai18n</artifactId>
    <version>12.1.0.2.0</version>
</dependency>

ORA-00904: "NODE_UUID": invalid identifier

解决:数据库字段缺失,少了NODE_UUID这个字段

ORA-12704: character set mismatch

解决:使用UNION时,字符集不匹配问题,字符串前面加 "N"

查询不出数据

解决:oracle不支持 <> '' 空字符串,需要使用空格来代替 <> ' '
在这里插入图片描述

ORA-00979: not a GROUP BY expression

oracle的order by 字段不在group by中就会报错;

Invalid column type: 1111

saveOrUpdate 中因为selectById的Id为null导致报错;但是在mysql中没问题;

解决: 修改活新增的判断改为手动判断ID是否为null,而不是selectById去查库判断;

ORA-01400: cannot insert NULL into ("ESCUSER". "PI_SS0_MOBILE_DEVICE"."ID")

解决:设置主键自增

oracle设置主键自增

-- 表名:PI_SSO_MOBILE_DEVICE 
-- 主键字段:id
alter table PI_SSO_MOBILE_DEVICE add constraint id primary key (id);

-- 自定义序列名 PI_SSO_MOBILE_DEVICE_SEQ
create sequence PI_SSO_MOBILE_DEVICE_SEQ
increment by 1 
start with 1 
nomaxvalue 
nominvalue 
nocache;

create or replace trigger PI_SSO_MOBILE_DEVICE_SEQ  
before insert on PI_SSO_MOBILE_DEVICE for each row 
begin 
        select PI_SSO_MOBILE_DEVICE_SEQ.nextval into :new.id from dual; 
end;

oracle修改字段类型

-- 要修改的字段名:PATH , 改为  NVARCHAR2(2000) :
-- 先添加一个PATH_NEW字段,然后把源字段值复制过来之后,
-- 再删除源字段,最后重命名一下新增的字段即可
alter table ACL_MENU add PATH_NEW NVARCHAR2(2000);
COMMENT ON COLUMN "ACL_MENU"."PATH_NEW" IS '字段描述';
update ACL_MENU set PATH_NEW=PATH;
alter table ACL_MENU drop column PATH;
alter table ACL_MENU rename column PATH_NEW to PATH;

附:oracle部署笔记

docker快速部署oracle19c、oracle12c,测试环境问题复现demo快速搭建笔记

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
2月前
|
存储 Oracle 关系型数据库
服务器数据恢复—光纤存储上oracle数据库数据恢复案例
一台光纤服务器存储上有16块FC硬盘,上层部署了Oracle数据库。服务器存储前面板2个硬盘指示灯显示异常,存储映射到linux操作系统上的卷挂载不上,业务中断。 通过storage manager查看存储状态,发现逻辑卷状态失败。再查看物理磁盘状态,发现其中一块盘报告“警告”,硬盘指示灯显示异常的2块盘报告“失败”。 将当前存储的完整日志状态备份下来,解析备份出来的存储日志并获得了关于逻辑卷结构的部分信息。
|
2月前
|
存储 Oracle 关系型数据库
【赵渝强老师】Oracle RMAN的目录数据库
Oracle RMAN默认将备份元信息存储在控制文件中,但控制文件损坏或丢失会导致恢复失败,且备份增多会使控制文件无限增长。为解决这些问题,Oracle引入了RMAN目录数据库(Catalog Database),专门用于存储RMAN备份的元信息。使用目录数据库可提升备份管理效率,支持多数据库共享、长期备份历史记录存储,并可保存RMAN脚本。本文详细介绍了如何创建目录数据库、注册目标数据库及其操作步骤。
|
3月前
|
存储 Oracle 关系型数据库
oracle数据恢复—oracle数据库执行错误truncate命令的数据恢复案例
oracle数据库误执行truncate命令导致数据丢失是一种常见情况。通常情况下,oracle数据库误操作删除数据只需要通过备份恢复数据即可。也会碰到一些特殊情况,例如数据库备份无法使用或者还原报错等。下面和大家分享一例oracle数据库误执行truncate命令导致数据丢失的数据库数据恢复过程。
|
5月前
|
Oracle 安全 关系型数据库
【Oracle】使用Navicat Premium连接Oracle数据库两种方法
以上就是两种使用Navicat Premium连接Oracle数据库的方法介绍,希望对你有所帮助!
1000 28
|
5月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的闪回数据库
Oracle闪回数据库功能类似于“倒带按钮”,可快速将数据库恢复至 earlier 状态,无需还原备份。本文介绍了闪回数据库的使用方法及实战案例:包括设置归档模式、开启闪回功能、记录SCN号、执行误操作后的恢复步骤等。通过具体 SQL 操作演示了如何利用闪回数据库恢复被误删的用户数据。注意,使用此功能前需确保数据库为归档模式。
149 9
|
6月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle数据库的闪回表
本文介绍了Oracle数据库中的闪回表(Flashback Table)功能,它能够将表的数据快速恢复到特定时间点或系统改变号(SCN),无需备份。文章通过实战示例详细演示了如何使用闪回表恢复数据,包括授权、创建测试表、记录时间与SCN号、删除数据、启用行移动功能、执行闪回操作以及验证恢复结果等步骤。同时,还展示了如何通过触发器禁止插入操作,并在闪回过程中处理触发器的启用问题。文末附有视频讲解,帮助读者更好地理解闪回表的使用方法。
213 10
|
6月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle数据库的闪回查询
本文介绍了Oracle数据库的闪回查询(Flashback Query)功能及其实际应用。闪回查询通过`AS OF`子句,结合时间戳或SCN号,可查询历史数据状态,帮助分析数据差异。文中通过具体示例演示了如何使用闪回查询:创建测试表、记录当前SCN号、更新数据并提交事务,最后通过闪回查询获取历史数据。附带的视频和代码块详细展示了操作步骤与结果。
204 4
|
6月前
|
Oracle 关系型数据库 网络安全
崖山异构数据库迁移利器YMP初体验-Oracle迁移YashanDB
文章是作者小草对崖山异构数据库迁移利器 YMP 的初体验分享,包括背景、YMP 简介、体验环境说明、YMP 部署(含安装前准备、安装、卸载、启动与停止)、数据迁移及遇到的问题与解决过程。重点介绍了 YMP 功能、部署的诸多细节和数据迁移流程,还提到了安装和迁移中遇到的问题及解决办法。

推荐镜像

更多