oracle适配总结

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 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快速搭建笔记

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
存储 自然语言处理 Oracle
Oracle数据库字符集概述及修改方式
【8月更文挑战第15天】Oracle 数据库字符集定义了数据的编码方案,决定可存储的字符类型及其表示方式。主要作用包括数据存储、检索及跨系统传输时的正确表示。常见字符集如 AL32UTF8 支持多语言,而 WE8MSWIN1252 主用于西欧语言。修改字符集风险高,可能导致数据问题,需事先备份并评估兼容性。可通过 ALTER DATABASE 语句直接修改或采用导出-导入数据的方式进行。完成后应验证数据完整性。此操作复杂,须谨慎处理。
|
11天前
|
SQL Oracle 关系型数据库
"揭秘!一键解锁Oracle日志清理魔法,让海量归档日志无处遁形,守护数据库健康,告别磁盘空间告急噩梦!"
【8月更文挑战第9天】随着Oracle数据库在企业应用中的普及,归档日志管理对保持数据库健康至关重要。归档日志记录所有更改,对数据恢复极为重要,但也可能迅速占用大量磁盘空间影响性能。利用Oracle提供的RMAN工具,可通过编写Shell脚本来自动清理归档日志。脚本包括设置环境变量、连接数据库、检查和删除指定时间前的日志,并记录执行情况。通过Cron作业定时运行脚本,可有效管理日志文件,确保数据库稳定运行。
37 7
|
8天前
|
Oracle 关系型数据库 MySQL
Mysql和Oracle数据库死锁查看以及解决
【8月更文挑战第11天】本文介绍了解决MySQL与Oracle数据库死锁的方法。MySQL可通过`SHOW ENGINE INNODB STATUS`查看死锁详情,并自动回滚一个事务解除死锁;也可手动KILL事务。Oracle则通过查询V$LOCK与V$SESSION视图定位死锁,并用`ALTER SYSTEM KILL SESSION`命令终止相关会话。预防措施包括遵循ACID原则、优化索引及拆分大型事务。
|
11天前
|
监控 Oracle 关系型数据库
"深度剖析:Oracle SGA大小调整策略——从组件解析到动态优化,打造高效数据库性能"
【8月更文挑战第9天】在Oracle数据库性能优化中,系统全局区(SGA)的大小调整至关重要。SGA作为一组共享内存区域,直接影响数据库处理能力和响应速度。本文通过问答形式介绍SGA调整策略:包括SGA的组成(如数据缓冲区、共享池等),如何根据负载与物理内存确定初始大小,手动调整SGA的方法(如使用`ALTER SYSTEM`命令),以及利用自动内存管理(AMM)特性实现智能调整。调整过程中需注意监控与测试,确保稳定性和性能。
22 2
|
26天前
|
Oracle 安全 关系型数据库
|
20天前
|
开发框架 Oracle 关系型数据库
ABP框架使用Oracle数据库,并实现从SQLServer中进行数据迁移的处理
ABP框架使用Oracle数据库,并实现从SQLServer中进行数据迁移的处理
|
1天前
|
数据采集 Oracle 关系型数据库
实时计算 Flink版产品使用问题之怎么实现从Oracle数据库读取多个表并将数据写入到Iceberg表
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
25天前
|
Oracle 关系型数据库 数据库
|
26天前
|
存储 Oracle 关系型数据库

推荐镜像

更多