Oracle 适配 OpenGauss 数据库差异语法汇总
背景
国产化进程中,需要将某项目的数据库从 Oracle 转为 OpenGauss ,项目初期也是规划了适配不同数据库的,MyBatis 配置加载路径设计的是根据数据库类型加载指定文件夹的 xml 文件。
后面由于固定了数据库类型为 Oracle 后,只写了 Oracle 的没有其他类型。从 Oracle 适配 OpenGauss 多少还是有些差异 SQL 语法的,本文记录一下。
之前不太了解 OpenGauss,但是接触过盘维数据库,这俩都可以用 postgre 的 Java 数据库驱动,把它们都归于 postgre 来看就可以了,目前发现了一些适配问题,都一一解决了,汇总如下。
varchar2 类型
Oracle 的数据库建表语句中的 varchar2 类型,直接在 OpenGauss 数据库中执行,也能兼容,但是实际类型为 varchar 。
NCLOB 类型
Oracle 的 NCLOB 类型到了 OpenGauss 应该配置为 bytea 。
LISTAGG 函数
Oracle 有 LISTAGG
函数生成动态拼接的 SQL ,MySQL 对应的函数是 GROUP_CONCAT
,到了以 postgre 为内核的 OpenGauss 应该用 string_agg
。
主键索引名称
Oracle 创建表设置主键索引的时候,索引名称可以跟表名称相同,例如这个建表语句:
CREATE TABLE MY_TABLE_1(field_a VARCHAR2(32),field_b VARCHAR2(50),field_c VARCHAR2(255),field_d VARCHAR2(32),field_e VARCHAR2(2),constraint MY_TABLE_1 primary key(field_a)
) ;
建表语句在后面设置表的主键,主键索引名称配置的与表名称一样,这个对 Oracle 没问题。
但是到了 OpenGauss 的时候会报 relation “xxx” already exists ,但是实际上这个名称的表并没有创建:
解决办法:设置索引名称与表名不一样,比如加个前缀。
此外,Oracle 的插入 SQL 中使用双引号转义的语句,到了 OpenGauss 也会报名称不存在异常,需要注意。
distinct 与 order by
对于 Oracle 数据库而已,使用 distinct 后 order by 的字段可以不包含在查询字段列表中,例如这个 SQL 语句是正确的在 Oracle 中:
SELECT DISTINCT field1,field2
FROM MY_TABLE
ORDER BY field3 DESC
但是在 OpenGauss 中报异常,SELECT DISTINCT ORDER BY 字段必须出现在查询字段列表中:
解决办法:统一 SQL 把排序字段加在查询字段列表中。
批量插入语法
Oracle 的批量插入 SQL 语句有两种方式,一种是用 begin end;
包裹的存储过程,另一种是使用 dual
中建表。
方法一:
<insert id="insertBatchSomeColumn" parameterType="java.util.List">begin<foreach collection="list" item="tempData" index="index" separator =";">INSERT INTO my_table(a,b,c,d)VALUES (#{tempData.a,jdbcType=VARCHAR},#{tempData.b,jdbcType=VARCHAR},#{tempData.c,jdbcType=VARCHAR},#{tempData.d,jdbcType=VARCHAR})</foreach>;end;
</insert>
方法二:
<insert id="insertBatchSomeColumn">INSERT INTO my_table(a, b, c, d)<foreach collection="list" item="item" index="index" separator="union all" open="(" close=")">select #{item.a,jdbcType=VARCHAR},#{item.b,jdbcType=VARCHAR},#{item.c,jdbcType=VARCHAR},#{item.d,jdbcType=VARCHAR} from dual</foreach>
</insert>
但是对于 OpenGauss 数据库的批量插入SQL 语法应该调整为:
<insert id="insertBatchSomeColumn" parameterType="java.util.List">INSERT INTO my_table(a,b,c,d) VALUES<foreach collection="list" item="tempData" index="index" separator =",">(#{tempData.a,jdbcType=VARCHAR},#{tempData.b,jdbcType=VARCHAR},#{tempData.c,jdbcType=VARCHAR},#{tempData.d,jdbcType=VARCHAR})</foreach>
</insert>
Quartz 兼容配置
使用了 Quartz 定时调度框架,当数据库换成 postgre 驱动的时候,需要调整 Quartz 的配置,主要有三点:
- 修改
spring.quartz.properties.org.quartz.jobStore.driverDelegateClass
这个属性为org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
。 - Quartz 的初始化 SQL 语句导入需要修改,
NCLOB
类型需要改为bytea
,例如:JOB_DATA bytea
。 - 调度任务的布尔字段类型,例如
QZ_CLS_JOB_DETAILS
表的IS_DURABLE
、IS_NONCONCURRENT
和IS_UPDATE_DATA
,需要从 varchar2(1) 改为 varchar(5)。因为 Oracle 存储布尔字段时用的字符串 0 和 1,但是 postgre 驱动用的是 true 和 false ,导致任务调度时出现字段超长异常。
字段大小写问题
Oracle 字段默认都是转化为大写的,MySQL 大小写不区分,但是 postgre 内核默认字段都是小写的。
这是比较麻烦的,如果查询语句中使用 Map 接收查询结果时,查询结果字段名称都转化为小写了。而从 Map 中 get 数据时的 key 都是大写的话,就会出现值为空的问题。
解决办法:自定义 MyBatis 的 Map 封装工厂,步骤如下:
第一步,定义 MapWrapper
实现子类定制查询结果的 Key 转为大写字母:
public class MyBatisCustomWrapper extends MapWrapper {public MyBatisCustomWrapper(MetaObject metaObject, Map<String, Object> map) {super(metaObject, map);}@Overridepublic String findProperty(String name, boolean useCamelCaseMapping) {// 转小写为toUpperCase()return name == null ? "" : name.toUpperCase();}
}
第二步,定义工厂类:
public class MyBatisMapWrapperFactory implements ObjectWrapperFactory {@Overridepublic boolean hasWrapperFor(Object object) {return object != null && object instanceof Map;}@Overridepublic ObjectWrapper getWrapperFor(MetaObject metaObject, Object object) {return new MyBatisCustomWrapper(metaObject,(Map)object);}
}
第三步,注入定制工厂:
@Bean
public ConfigurationCustomizer mapUpgrade() {return configuration -> configuration.setObjectWrapperFactory(new MyBatisMapWrapperFactory());
}
datasource 配置
Oracle 数据库连接配置一般会用到 validation-query: SELECT 1 FROM DUAL
,换成 OpenGauss 后需要注释掉这个配置。
启示录
目前发现的就是这些问题,解决的还是比较顺利的。还是需要对整个系统的功能逐个进行测试,直接用 MyBatis 的框架封装的方法没有问题,麻烦的是各种通过 @Select
注解嵌入在代码中的SQL语句,需要逐个排查。
一开始约定好SQL语句都在 resource 中定义的话,相对会比较好一点,如果有不同的话,就可以放在不同目录里面通过 mybatis-plus.mapper-locations
配置来指定。但是在 DAO 里面定义的 SQL 就必须通过定义多个方法来区分了。
相关文章:
Oracle 适配 OpenGauss 数据库差异语法汇总
背景 国产化进程中,需要将某项目的数据库从 Oracle 转为 OpenGauss ,项目初期也是规划了适配不同数据库的,MyBatis 配置加载路径设计的是根据数据库类型加载指定文件夹的 xml 文件。 后面由于固定了数据库类型为 Oracle 后,只写…...
【记录】Django解决与VUE跨域问题
1 梗概 这里记录Django与VUE的跨域问题解决方法,主要修改内容是在 Django 中。当然其他的前端项目 Django 也可以这样处理。 2 安装辅助包 pip install django-cors-headers3 配置 settings.py INSTALLED_APPS [ # ... corsheaders, # ... ] 为了响应…...
Yolov10本地部署,torch找不到GPU问题解决
在本地部署跑Yolov10的模型.具体分为以下几步,也是踩了一些坑: 1.YoloV10 代码拉取 2.安装CUDA 1.查看CUDA支持版本 2.下载安装CUDA 3.下载CUDNN 3.创建python虚拟环境 Anaconda下载安装 虚拟环境安装配置 4.运行 1.yoloV10代码拉取 源码地址: GitHub - THU-MIG/yolov10: YOLO…...
el-upload 上传文件 入参格式为form-data格式,入参字段为code、name、type、file(文件)的形式,如何实现?
el-upload 是 Element UI 中用于文件上传的组件。如果你需要上传文件并将其封装为 form-data 格式,并且包含字段如 code、name、type 和 file,你可以通过自定义 before-upload 或 action 进行处理。 1. el-upload 的基本用法 Element UI 的 el-upload …...
VUE组件插槽使用示例,弹窗样式
在Vue.js中,插槽(slots)是一种非常强大的功能,它允许你在父组件中向子组件传递内容。插槽主要有三种类型:默认插槽、具名插槽和作用域插槽。下面是一些示例来展示如何使用这些插槽。 默认插槽 默认插槽是最简单的插槽…...
ARM嵌入式学习--第八天(PWM)
PWM -PWM介绍 PWM(pulse Width Modulation)简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在测量,通信,工控等方面 PWM的频率 是指在1秒钟内,信号从…...
新能源汽车大屏可视化第三次数据存储
任务: 将数据存放到temp.csv 链接: 1.排行页面 https://www.dongchedi.com/sales 2.参数页面 https://www.dongchedi.com/auto/params-carIds-x-9824 完善打印: 1. [{‘series_id’: 5952, ‘series_name’: ‘海鸥’, ‘image’: ‘https://…...
linux 替换yum源镜像
1. 备份源镜像 sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2. 下载国内镜像阿里云 如果没有wget可以用curl 代替 sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 清华大学 sudo wget -…...
SAP:如何修改已释放的请求
SAP:如何修改已释放的请求 QQ出了一个新功能,把10年前的旧日志推给自己。这个10年前的日志,是用户反映在SE10中把请求释放后发现漏了内容,想修改已释放的请求。经调查写了一个小程序,实现用户的需求。 *&-------------------…...
js的?. 和??和||有什么区别
let a 0; let b null; let c Hello;console.log(a ?? default); // 0 console.log(b ?? default); // "default" console.log(c ?? default); // "Hello"console.log(a || default); // "default" (因为 0 是假值) console.log(b |…...
clickhouse 分布式表创建、增加、更新、删除、查询
创建分布式表 --先创建本地表 设置自动过期时间3天 CREATE TABLE IF NOT EXISTS ck_database.ck_databaseon cluster default(cluster name) (table_id String COMMENT id,item_id String COMMENT 业务id,desc Int64 COMMENT 描述,time DateTime DEFAULT now() COMMENT 数据…...
推送本地仓库到远程git仓库
目录 推送本地仓库到远程git仓库1.1修改本地仓库用户名1.2 push 命令1.3远程分支查看 推送本地仓库到远程git仓库 删除之前的仓库中的所有内容,从新建库,同时创建一个 A.txt 文件 清空原有的远程仓库内容,重新创建一个新的仓库,…...
LSTM长短期记忆网络
LSTM(长短期记忆网络)数学原理 LSTM(Long Short-Term Memory)是一种特殊的递归神经网络(RNN),解决了标准RNN中存在的梯度消失(Vanishing Gradient) 和**梯度爆炸&#x…...
ABAP SQL 取日期+时间最新的一条数据
我们在系统对接的时候,外部系统可能会推送多个数据给到我们。 我们 SAP 系统的表数据中日期和时间是作为主键的,那么如果通过 ABAP SQL 取到最新日期的最新时间呢。 解决方案: 方式 1:SELECT MAX 可以通过两个 SELECT MAX 来取…...
SAST静态应用安全测试常见的编码规则
行业优先级难易度标准标准名称数量 军工12易GJB 5369:2005GJB_5369(国家军用标准航天型号软件C语言可靠性编程规范)138军工行业最早的C语言编码标准,强制性4易GJB 8114:2013GJB_8114(国家军用标准C/C语言可靠性编程规范ÿ…...
AI相关专业名词汇总解释
1.SFT Supervised fine-tuning,“有监督微调”意味着使用有标签的数据来调整一个已预训练好的语言模型(LLM),使其更适应某一特定任务。通常LLM的预训练是无监督的,但微调过程往往是有监督的。 详解:https:/…...
【C语言】指针数组和数组指针
前言 指针数组和数组指针是C语言中经常混淆的两个概念,虽然他们的名字相似,但其含义却完全不同。 指针数组 指针数组本质是一个数组,特点是数组中的元素均为指针,其定义形式为: 数据类型 *指针名[长度] 例如 int *…...
联邦学习中:公共物品属性的一般定义
在经济学和相关领域中,公共物品属性具有特定的含义,在论文中与联邦学习数据交易等情境相关联时,其意义如下: 公共物品属性的一般定义 非排他性 公共物品一旦被提供,很难或不可能排除其他人使用。例如,路灯照亮了街道,一个人使用路灯照明并不会阻止其他人同时使用,无法…...
前端的Python应用指南(一):快速构建 Web 服务器 - Flask vs Node.js 对比
随着前端开发技术的不断发展,前端开发者的技术栈也在不断扩展。如今,前端开发者不仅要掌握 HTML、CSS、JavaScript,还要掌握后端技术,成为全栈开发者。而在后端技术的选择上,Python 和 Node.js 是两种非常流行的选择。…...
典型案例 | 旧PC新蜕变!东北师范大学依托麒麟信安云“旧物焕新生”
东北师范大学始建于1946年,坐落于吉林省长春市,是中国共产党在东北地区创建的第一所综合性大学。作为国家“双一流”建设高校,学校高度重视教学改革和科技创新,校园信息化建设工作始终走在前列。基于麒麟信安云,东北师…...
【UE5】pmx导入UE5,套动作。(防止“气球人”现象。
参考视频:UE5Animation 16: MMD模型與動作導入 (繁中自動字幕) 问题所在: 做法记录(自用) 1.导入pmx,删除这两个。 2.转换给blender,清理节点。 3.导出时,内嵌贴图,选“复制”。 …...
ROS+PX4+Gazebo仿真环境配置全流程解析
上一期文章介绍了我们即将发布的仿真平台,并提到后续需要在Ubuntu系统上进行PX4软件在环仿真。本期文章将为大家详细介绍如何配置Ubuntu环境以及安装ROS和PX4仿真环境。具体配置包括:Ubuntu 20.04 ROS Noetic PX4 Python3。 需要注意的是,…...
STM32F103单片机HAL库串口通信卡死问题解决方法
在上篇文章 STM32F103单片机使用STM32CubeMX创建IAR串口工程 中分享了使用cubeMX直接生成串口代码的方法,在测试的过程中无意间发现,串口会出现卡死的问题。 当串口一次性发送十几个数据的时候,串口感觉像卡死了一样,不再接收数据…...
基于微信小程序的电影院订票选座系统ssm+论文源码调试讲解
第2章 开发环境与技术 本章节对开发基于微信小程序的电影院订票选座系统需要搭建的开发环境,还有基于微信小程序的电影院订票选座系统开发中使用的编程技术等进行阐述。 2.1 Java语言 Java语言是当今为止依然在编程语言行业具有生命力的常青树之一。Java语言最原始…...
解决新安装CentOS 7系统mirrorlist.centos.org can‘t resolve问题
原因 mirrorlist.centos.org yum源用不了 解决办法就是 # cd /etc/yum.repos.d/ # mv CentOS-Base.repo CentOS-Base.repo_bak # vim CentOS-Base.repoCentOS系统操作 # mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/*.repo_bak # curl -o /etc/yum.repos.d/CentOS-Linux-Ba…...
分布式系统架构3:服务容错
这是小卷对分布式系统架构学习的第3篇文章,虽然知道大家都不喜欢看纯技术文章,写了也没多少阅读量,但是个人要成长的话,还是需要往深一点的技术上去探索的 1.为什么需要容错 分布式系统的本质是不可靠的,一个大的服务…...
鸿蒙项目云捐助第十四讲云函数的初步使用
鸿蒙项目云捐助第十四讲云函数的初步使用 在开发项目的过程中,云端充分利用已成为一种驱势。云监控,云运维,云开发,云办公等等软件层出不穷,本地软件云端化也成为一种潮流。在这股大潮中,华为云也是独树一…...
【5G】5G的主要架构选项
最初,在3GPP讨论中考虑了所有可能的聚合和核心网络组合,共有八个架构选项。以下重点介绍option2、3、4和7。 1. 独立组网 (Standalone, SA) 架构选项 2 :Standalone architecture with 5G-core 特点: 5G核心网(5GC, …...
【Laravel】端口问题导致菜单打不开
以下是修改 Laravel 应用程序的端口配置, 修改环境变量 APP_URL 来实现 app/Providers/AppServiceProvider.php <?phpnamespace App\Providers;use Illuminate\Events\Dispatcher; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\URL…...
网络安全等级保护系统定级流程与示例
一、定级流程 安全保护等级初步确定为第二级及以上的等级保护对象,其运营使用单位应当依据《网络安全等级保护定级指南》进行初步定级、专家评审、主管部门审批、公安机关备案审查,最终确定其安全保护等级。 二、定级方法 等级保护对象的级别由两个定级…...
项目练习:若依-ruoyi系统的部署与运行(前后端分离版)
文章目录 一、我的环境二、代码下载三、数据库配置四、项目配置文件修改五、启动运行六、验证 一、我的环境 jdk:8 MySQL:5.7 Redis: nodejs:v16.13.2 npm:8.1.2 vue:5.0.8 开发工具 idea Navicat for MyS…...
【UE5 C++课程系列笔记】10——动态单播/多播的基本使用
目录 概念 申明动态委托 一、DECLARE_DYNAMIC_DELEGATE 二、DECLARE_DYNAMIC_MULTICAST_DELEGATE 绑定动态委托 一、BindDynamic 二、AddDynamic 三、RemoveDynamic 执行动态委托 一、Execute 二、ExecuteIfBound 三、IsBound 四、Broadcast 动态单播使用示…...
Netcat:网络中的瑞士军刀
免责声明:使用本教程或工具,用户必须遵守所有适用的法律和法规,并且用户应自行承担所有风险和责任。 文章目录 一、引言二、简述三、Netcat功能?四、参数选项五、Netcat 的常见功能六、高级用法多连接处理创建简单的代理 七、Netc…...
清理C盘小记
突然C盘就爆满了,想当初还是给他预留了120G的空间,感觉到现在也不够用了,担心出现死机的情况就赶紧进行了清理。有一说一,清理回收站是真的有用。 参考:C盘清理指南,清理出30G起,超详细总结&am…...
Qt WORD/PDF(四)使用 QAxObject 对 Word 替换(QWidget)
关于QT Widget 其它文章请点击这里: QT Widget 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 姊妹篇: Qt WORD/PDF(一)使用 QtPdfium库实现 PDF 操作 Qt WORD/PDF(二…...
软件工程 设计的复杂性
复杂性代表事件或事物的状态,它们具有多个相互关联的链接和高度复杂的结构。在软件编程中,随着软件设计的实现,元素的数量以及它们之间的相互联系逐渐变得庞大,一下子变得难以理解。 如果不使用复杂性指标和度量,软件…...
《解决两道有趣的编程问题:交替数字和与简单回文》
在编程的世界里,算法和逻辑的挑战无处不在。今天,我们将用 Python 来解决两道有趣的编程问题,分别是计算交替数字和以及生成简单回文。 一、交替数字和(Alternating Sum of Numbers) 1. 问题描述 给定一系列整数&am…...
C语言(结构体练习)
设计一个结构体,存放一个学员信息并显示,存放两个学员信息,算他们的平均分。 #include <stdio.h> #include <string.h>// 定义结构体 typedef struct {char name[50];float score; } Student;// 函数声明 void display(Student student); f…...
Lumoz主网启航:为ETH3.0、ZK和AI提供无穷算力
一个成熟的区块链主网是技术落地的体现,更是项目战略布局的开端,预示着全球化扩展和技术创新的全面启动。12 月9日,Lumoz主网的正式上线为生态系统注入了强大的潜力,并为未来的技术发展、市场拓展和社区建设提供了坚实的基础&…...
MySQL技术:事务处理与锁机制
在现代数据库系统中,事务处理和锁机制是确保数据一致性和完整性的关键技术。MySQL作为一个强大的关系型数据库管理系统,提供了完善的事务支持和多种锁机制来处理并发数据访问。本文将深入探讨MySQL中的事务处理和锁机制,以及如何有效使用它们…...
uniapp炫酷导航按钮及轮播指示器组件
一个拥有炫酷动效的导航按钮和指示器uniapp组件,帮你构建更炫酷的官网、宣传页、产品介绍等页面。 目前测试了vue2语法在h5和微信小程序的适配,其他平台理论上也能用。 下载及使用方法地址:iliya-desgin 展示: 目标页面出现在可视…...
gdb调试常用指令及案例讲解
一、常用指令 运行 -g:使用该参数编译可以执行文件,得到调试表。 编译 # 运行 gdb ./a.out# 设置参数 set args -s ./data/uvd.tcl 控制参数 断点 list/l :list 1 列出源码。根据源码指定 行号设置断点。 b …...
LeetCode 刷题笔记
LeetCode 刷题笔记 1. 20241218 (1)2447 std::gcd是C17引入的一个函数,用于计算两个整数的最大公因数。位于<numeric>头文件中。 #include <iostream> #include <numeric> // std::gcdint main() {int a 36;int b 60…...
重新定义页签!Choerodon UI Tabs让管理更高效
01 引言 Tabs 组件通过提供平级区域,将大块内容进行有效的收纳和展现,从而保持界面整洁。但在企业应用的快速发展中,这样传统的页签组件已无法满足我们对界面布局和个性化展示的追求。Choerodon UI Tabs 组件通过支持多级分组、个性化配置、…...
OnlyOffice出现JWT问题和文档下载失败问题解决
一、文档安全令牌未正确形成: 解决方案:禁用jwt,并且重启服务 文件位置:C:\Program Files\ONLYOFFICE\DocumentServer\config\local.json "token": {"enable": {"request": {"inbox":fa…...
Python面试常见问题及答案3
一、基础语法相关 问题:Python中如何实现多态? 答案:在Python中,多态是一种动态类型机制的体现。比如,通过定义一个具有相同方法名的类,不同的类可以根据自身的定义实现这个方法的不同行为。例如ÿ…...
【Java学习笔记】多线程基础
并行:同一时刻,多任务同时进行 多任务分别进行 一、线程相关概念 1.程序 是为完成特定任务、用某种语言编写的一组指令的集合。 简单的说:就是我们写的代码 2.进程 (1)进程指的就是运行中的程序,比如我们使用QQ,就…...
使用stm32的ADC和NTC热敏电阻R值是10k,B值是3950的测温程序
首先要明确NTC热敏电阻的阻值是随温度升高,电阻降低的一个特性,加上拉电阻10K,不过一下子没有找到10K的上拉电阻,就用了一个8.2K的上拉电阻到3.3V,测温电阻一端接地,中间接stm32的PA1使用ADC测电压来计算温…...
详细解读BSCI验厂
BSCI验厂是指BSCI(Business Social Compliance Initiative)倡议商界遵守社会责任组织对BSCI组织成员的全球供应商进行的社会责任审核。以下是对BSCI验厂的详细解读: 一、BSCI验厂的定义与背景 定义:BSCI验厂是企业社会责任验厂的…...
Visual Studio 2022 QT5.14.2 新建项目无法打开QT的ui文件,出现闪退情况
新建 Qt Widgets Application项目,如下图: 点击下一步: 项目创建成功如下: 提示异常如下图: ***.ui 无法打开文件。 提供三种解决办法,本文使用第二种方式解决,选择适合您的解决方法&#x…...