- 博客(127)
- 收藏
- 关注
原创 基于语法树的SQL自动改写工具开发系列(3)-使用JAVA进行简单SQL改写的开发实战
相比python而言,java处理语法树的处理性能好太多了,原本用python写几个转换感觉只能当成玩具耍耍,用到java后,感觉这种自动化改写完全可以当成正式的产品来用了。基于语法树改写的比正则替换的风险小多了,而且新增功能也很简单。目前我已经写了几十种ORACLE迁移到openGauss的自动转换规则,并且做了很多自定义的参数配置,后续看情况可能会开源。
2024-12-29 17:23:33
1184
原创 【openGauss】正则表达式次数符号“{}“在ORACLE和openGauss中的差异
有很多所谓的"标准功能",在不同的环境下有不同的"标准",这些"标准"各有各的准则,经过多年的发展,很难强求其一致性。就连正则表达式这样常用的功能都有不同的标准,就不要指望ANSI SQL能让任意相同语句在每个数据库中执行结果完全一致了。在去O的过程中,经常能发现以往很多写得不标准的应用代码,此时正是好机会将这些代码变得更加规范。DarkAthena本博客所有文章除特别声明外,均采用许可协议。转载请注明出处。
2024-12-29 01:43:47
1177
原创 【MogDB】MogDB5.2.0重磅发布第十篇-支持PLSQL嵌套子程序
在ORACLE的PLSQL中,支持在procedure、function及匿名块中,嵌套定义procedure和function,编写这样的代码,算是一种低耦合高内聚的风格。在openGauss 6.0及之前的版本,并不支持嵌套子程序(预计7.0版本会支持),但通过实测,MogDB 5.2.0支持的场景比openGauss 7.0(截止到2024年12月19号的代码)要多。在ORACLE的官方文档里,将子程序分为三种,我简单描述一下独立子程序。
2024-12-22 22:07:36
932
原创 基于语法树的SQL自动改写工具开发系列(2)-使用PYTHON进行简单SQL改写的开发实战
前面一篇写了如何搭建环境,本文接着讲怎么使用antlr4进行开发。antlr4很强大,我们可以借助其语法树的能力,实现精准的语法改写,当然前提是我们要先想好怎么去改写,然后才能编写对应的规则。这种方式虽然比正则替换要慢很多,但是对于大量复杂的存储过程而言,使用语法树进行改写的方式无疑比正则替换更加可靠。使用高级开发语言还可以连接数据库获取元数据来推断被引用的对象类型和属性,来进行更加个性化的复杂逻辑改写。DarkAthena本博客所有文章除特别声明外,均采用许可协议。转载请注明出处。
2024-11-16 17:05:17
1192
1
原创 基于语法树的SQL自动改写工具开发系列(1)-离线安装语法树解析工具antlr4
最近遇到个项目,打算做ORACLE应用系统里的PLSQL重构,将一些ORACLE独有的高级语法改写成指定的通用语法,以便能支持在更多的数据库上运行,但该应用系统里的PLSQL代码量实在太大,人工改写或者正则替换都不是那么容易,数据库厂家的自动改写工具也只能提供一种规则的自动转换,不能定制转换规则,所以还是期望借助语法树解析工具来做一些个性化定制的改写。
2024-11-16 16:59:22
1035
原创 【MogDB】MogDB5.2.0重磅发布第八篇-支持PLSQL编译全局缓存
在我之前的文章中有提过,原生PG对于重度存储过程的应用系统适配,具有一个致命缺陷,即原生PG中的plsql是会话级缓存,这意味着每个会话在第一次执行某个存储过程时,都需要对这个存储过程进行编译,并且将编译结果缓存到本会话,由此引发巨大的内存占用(应用连接池多连接)以及首次调用时的严重性能问题(应用短连接)。
2024-11-16 15:14:45
1326
1
原创 【MogDB】MogDB5.2.0重磅发布第七篇-支持PLSQL编译依赖
在原生PG中,创建一个自定义函数或者存储过程,如果出入参的类型不存在,那么创建将会报错;但在ORACLE中仍然可以创建,只是状态为失效,后续补上缺少的类型即可。而原生PG则必须依照特定的顺序来创建数据库对象。openGauss2.1版本起新增了package这种可以内建类型、函数、过程的对象,整个依赖关系变得更加复杂,自动化迁移工具已经无法一次性自动将ORACLE的全部对象在openGauss中进行一次性创建。
2024-11-10 22:17:09
839
原创 从pg_depend和pg_class开始了解MogDB/openGauss/postgresql的系统元数据设计
学习任何一种数据库,必须要了解它的数据字典,这样有利于了解数据库的结构、解读部分日志、定位一些问题。PG/OG系数据库的系统元数据遵从一个统一的设计规则,可以让初学者快速入门。本文以MogDB为例,剖析一下PG/OG系数据库的系统元数据设计哲学。一、pg_depend先来看pg_depend的表结构名称类型引用描述classidoid有依赖对象所在系统表的OID。objidoid任意OID属性指定的依赖对象的OID。
2024-11-06 12:51:28
1201
1
原创 【ORACLE】对Oracle中char类型的研究分析
在国产数据库做ORACLE兼容性实现时,无可避免会遇到CHAR类型的差异,但是对于大多数的应用开发者来说,并不会深入去了解char类型的机制。很多开发者之前在ORACLE上就没弄懂,好不容易写出来的SQL在ORACLE能查到想要的东西了,但是一迁移到国产库的时候,发现相同的SQL,查询结果不一样了,可能是查到的数据变多了,也可能是查到的数据变少了,甚至排序结果都出现了不一致。虽然,在ORACLE官方文档中,就有这个字符串比较的说明但是空对着规则看,没有实际的场景,想象不到实际的复杂度。
2024-11-02 01:06:10
977
原创 【MogDB】MogDB5.2.0重磅发布第九篇-SQL宽容性提升
在ORACLE迁移到国产库的过程中,经常会遇到一些由于原本SQL不是太标准而导致在国产库上报错。这种错误,如果只有一个两个,手动改了就好了,但是如果如果要改的量非常大,还不能批量替换,而且不能根据数据库的报错信息直接判断出原因,就很是难受,浑身蚂蚁在爬一样,需要反复投入大量人力干一些没技术含量的活。因此MogDB考虑把项目中遇到的这些点,在数据库内核里全给支持了,使SQL的宽容度得到极大提升。
2024-11-02 00:51:16
609
原创 【MogDB】MogDB5.2.0重磅发布第六篇-支持自定义复杂对象类型
在期货行业的ORACLE数据库中,经常可以看到有大量的自定义复杂对象类型,类似以下代码beginreturn;end;beginend;end;end;beginend;beginend;end;而openGauss并不支持创建这种对象,只能支持不带type body的复合类型。截止到20240930的openGauss 6.0版本发布,也仍旧不支持(不过从2024年10月14号起,openGauss源码中已经有部分支持了)。
2024-11-02 00:43:46
1013
原创 【MogDB】MogDB5.2.0重磅发布第五篇-支持部分ORACLE的HINT
ORACLE里支持的hint其实远不止这些,但由于底层原理上存在一些差异,任何非ORACLE数据库都不可能做到和ORACLE的hint全兼容,每种数据库都应该有自己特有的SQL优化器。因此,就算做了一些ORACLE的兼容HINT,也不能说性能就能和ORACLE一样,如果想要得到最佳性能表现,仍然离不开数据库内核自身的优化能力。DarkAthena本博客所有文章除特别声明外,均采用许可协议。转载请注明出处。
2024-11-02 00:35:36
1042
原创 【openGauss】OPENGAUSS/POSTGRESQL 中float类型到int类型的隐式转换
则会发现oracle和openGauss中同样返回了2,这个时候就会猜想是不是这个float类型在两个数据库中实现并不一样导致的,因为ORACLE的float是按number格式存储的,不是标准定义中的浮点类型,而是一种精确类型;于是我们回到最初的猜想,这个问题仍然与不精确的浮点类型有关,其实ORACLE也有这种浮点类型,叫binary_float和binary_double,这两个类型不能在sql中使用,只能在plsql中使用,我们写个简单的例子在ORACLE进行测试。
2024-10-19 17:02:45
877
原创 【MogDB】MogDB5.2.0重磅发布第三篇-支持astore下的rowid
PG/OG系最佳的rowid实现方案,在astore下必然无法实现,所以OG系的ustore应该是当下最佳实现方案,但ustore仍然还需要一段时间来进行市场验证。因此MogDB5.2.0在astore下实现的这个rowid,在一众PG/OG系的解决方案里,属于是一种全新的方案了,这种方案不仅没有让DML性能下降,又可以比同样DML性能没有下降的其他数据库支持更多的场景,是PG/OG系中已知的目前唯一一款在astore下没有新增物理字段又同时支持了这5个rowid使用场景的数据库。
2024-10-19 01:09:47
1015
原创 【MogDB】MogDB5.2.0重磅发布第四篇-支持windows版gsql,兼容sqlplus/sqlldr语法
本文所列出的功能,在windows上的sqlplus和gsql、sqlldr和gs_loader的最终执行效果几乎完全一致。甚至如果本地没有sqlplus/sqlldr,把gsql.exe/gs_loader.exe改成sqlplus.exe/sqlldr.exe,批处理的脚本几乎不用改,可以把MogDB当成ORACLE去执行这些脚本。当然,其实也可以看到,有一些运维常用命令在这个版本中的gsql并没有支持,比如exit退出客户端,conn的完整指令connectexecute的缩写exec。
2024-10-19 00:05:19
1144
原创 【MogDB】图形化开发工具Mogeaver使用方法看这一篇就够了
Mogeaver [moˈgi:və® ] 基于流行的开源图形化工具DBeaver,在严格遵循DBeaver Community Edition 的ASL开源协议基础上,进行了二次开发和封装,支持对于MogDB数据库的图形化开发及管理,支持通过图形化的方式创建,修改,调试数据库内的存储过程,自定义函数,及包。SQL编辑器包含脚本面板、工具栏和结果面板。提示:您可以按Alt+Enter或右键单击并导航到首选项来打开SQL编辑器首选项。
2024-10-17 17:02:07
1190
原创 【MogDB】MogDB5.2.0重磅发布第二篇-发布了哪些介质,如何获取?
有不少小伙伴在问:这次改动这么大,周边的这些工具是不是也会要一起更新?没错,伴随MogDB 5.2.0的发布,MogDB的生态工具也进行了一系列的更新,本文附上对应配套工具的版本号及下载地址。
2024-10-09 12:14:25
592
原创 【MogDB】MogDB5.2.0重磅发布第一篇-从参数和数据字典的变化来看引入了哪些新特性
MogDB 5.2.0版本于9月30号发布,该版本继承MogDB5.0版本的所有特性,并且在ORACLE兼容性上进行了非常大的提升,官方说法是新增了九十多项兼容性,但作为整个版本的全程亲历者,我知道新增的远远不止九十多项,因为有些小功能合并成了一个大功能,还有一些点当成是对已有功能的优化没算进来。如果全部打散成一个个小的功能点,应该是超过两百项的!
2024-10-07 21:18:44
1017
原创 【openGauss/MogDB】SQLCODE竟然不是数值类型?
在openGauss/MogDB中,有一条这样的规则兼容O模式下,SQLCODE等于SQLSTATE原生PG中,SQLCODE是整型数值,SQLSTATE是5字符的字符串;ORACLE中的SQLCODE也是数值类型。于是之前基于ORACLE或者基于PG的应用程序,在迁移到openGauss/MogDB后,如果使用数值型变量接收sqlcode,或者对sqlcode进行数值大小判断时,都会可能出现类似这样的报错。
2024-07-18 23:17:01
727
原创 【MogDB】在ORACLE和MogDB中查看存储过程出参游标数据的方式
使用ORACLE作为数据库的应用软件中,偶尔会遇到使用游标作为出参的存储过程,这种存储过程迁移到MogDB并不需要进行改造,但是在开发这样的存储过程时,开发人员偶尔会想要在数据库中测试执行一下,看看游标中的数据是否符合预期,但游标并不是常规的基本数据类型,再写一段plsql或者其他语言的代码去扫游标中的数据打印出来又会有额外的开发量。因此本文介绍几种在开发过程中,ORACLE和MogDB查看出参游标数据的方式。
2024-04-13 19:45:13
1366
原创 【MogDB】解读MogDB5.0.6版本中有关兼容性的一些更新
MogDB于2024-03-30发布了其5.0版本的补丁版本—5.0.6,其在MogDB 5.0.5的基础上新增部分特性并修复了部分缺陷,具体内容可参考官方文档# MogDB 5.0.6发布说明相信有一些伙伴和我一样对兼容性的部分感兴趣,因此本篇就针对本次更新的一些涉及到有关兼容性的东西,大概说说其实补丁版本中一般也不会增加多少内容,从本文列举的这些兼容性点上来看,很多都是很细小的变动。
2024-03-31 19:00:36
1142
原创 【MogDB】实战MogDB数据库适配Halo博客系统1.6版本(基于springframework+hibernate+HikariPool)
前一篇文章说了MogDB适配Halo,【MogDB】将流行的博客系统Halo后端的数据库设置为MogDB,但是适配的是2.x版本,由于2.x版本已经引入了对postgresql的支持,而MogDB对于postgresql有很好的兼容性,因此适配起来很简单。但是由于halo2.x的版本进行了全部的重构,从1.6版本并不能无痛升到2.x版本,所以仍有很多用户在使用1.6版本。
2024-03-06 23:01:24
1151
原创 【MogDB】将流行的博客系统Halo后端的数据库设置为MogDB
本人的个人博客站点()基于Halo博客系统搭建,该博客系统后端可以配置多种数据库,默认为H2,但是最新版已不建议使用H2,而是建议使用mysql/postgresql等数据库。经验证,MogDB数据库也可以作为Halo博客系统的后端数据库。
2024-02-21 20:32:44
915
原创 恼人的“龙天“(䶮)--谈谈从GBK转到GB18030的特殊情况
这个字的外形是 ,上面是“龙”,下面是“天”。其实正常的输入法是可以输入这个外形的字的,但是,实际上你用输入法输入的这个字,并不是我上面提到的这个字,它们只是外形完全一样的“两个字”
2024-01-12 18:58:23
2266
原创 【openGauss】如何通过pg_trigger.tgtype获取触发器的各种触发条件
最近有客户反馈兼容的dba_triggers视图中,同一个触发器的trigger_event被拆成了多行,和ORACLE中表现不一致,于是我进行了一些分析,发现是在其引用的information_schema.triggers视图中就已经拆开成了INSERT/DELETE/UPDATE,但是这些属性都是通过tgtype这一个int2整型的字段获取的,甚至连before/after/instead of/row/statement 等都是通过这一个字段。
2023-12-02 01:53:30
478
1
原创 【MogDB】操作系统依赖动态库解耦测试(MogDB 5.0.1以上)
数据库作为一类软件,用户期望的是功能越多越好,但是同时又期望越轻量化越简单越好,本身就是一种矛盾。MogDB在openGauss社区版的基础上,不断吸收来自各行各业真实用户的各种建议,结合团队丰富的开发和运维经验,对于数据库快速安装方面,摸索出其中的平衡点,即ptk+mogdb的组合,让用户不再为安装数据库而发愁。DarkAthena本博客所有文章除特别声明外,均采用许可协议。转载请注明出处!
2023-12-02 01:42:40
618
原创 【openGauss】带有out参数的存储过程及自定义函数的重载测试
对于openGauss一、以下两条不会由于重载选项的差异发生行为改变1.使用ORACLE风格语法的procedure和function,创建规则和ORACLE一致,同名对象直接覆盖2.使用PG风格的FUNCTION,支持入参不一致的重载创建;对于入参一致,仅出参有差异的,会直接覆盖(如果return类型变化,创建会报错)二、重载选项会控制package中的procedure能否创建仅出参不一致的重载,关闭选项时,重载规则为仅入参不匹配;开启选项时,重载规则为任意参数不匹配。
2023-07-31 13:50:56
362
原创 【openGauss】从“functions in index expression must be marked IMMUTABLE“谈起
函数索引无论在哪个数据库中,都不是推荐用法
2023-07-11 23:24:50
1110
原创 【ORACLE】一条看不出会删哪个表的delete语句
最近遇上一条ORACLE里的SQL,以我十多年的复杂SQL编写经验,我竟然一时半会无法用SQL语法解析出这条SQL的语义,而且这个SQL竟然是可能可以执行成功的!
2023-06-04 01:05:00
887
原创 【openGauss】如何将数据库中的自定义复合类型绑定到java的class中
某客户,将应用的数据库从oracle迁移到openGauss系,源库中使用了大量的自定义type,所以java代码里也有很多对type对象的处理。在oracle中可以直接传对象给数据库,但是openGauss/postgresql的源码用例中,都是通过PGobject.setValue,把对象中的所有值拼成一个字符串,用逗号分隔,用括号括起来。如果对象中的某个值可能存在有逗号,那么就会出现异常。我以前没正经写过java,只能看懂个大概意思,当然,依葫芦画瓢也没啥问题。
2023-05-22 00:38:47
533
2
原创 【ORACLE】极速通关Oracle23c开发者免费版连接
oracle23c开发者免费版已经于2023年4月4日(北京时间)推出,并且官方也公布了安装介质的下载地址,有RPM安装包、VM虚拟机、docker镜像(下载链接见文末)。由于最近工作比较忙,暂时无法写一篇内容丰富的测试,所以先提供一个最快速体验的方法,省去对于开发者而言,繁琐的安装步骤。(docker环境部署略,实测windows docker也能启动)
2023-04-05 14:33:44
571
原创 【openGauss】把应用开发中的设置客户端字符编码往细了说
早前写过两篇有关Oracle字符集的文章基本说明了 ”数据字符编码“、”客户端字符编码“、”数据库字符编码“三者的关系,这些关系,对于openGauss/MogDB/postgresql其实是一样的,即”数据字符编码“和”客户端字符编码“应保持一致,且对应的字符集为”数据库字符集“的”子集
2023-02-01 20:08:57
1544
原创 【openGauss】一键编译openGauss3.1+dolphin,体验新增的mysql兼容特性
前两天写了一篇openGauss3.1关于mysql的相关特性,但由于openGauss官网提供下载的版本还是9月30号第一次发布的版本,很多特性都还没合入,于是我整理了2个脚本,实现真正的一键式编译并自动安装及启动数据库
2022-12-25 14:20:37
1064
8
原创 【openGauss】浅试openGauss3.1.0中有关mysql兼容的部分特性
在9月30号,openGauss推出了3.1.0这一预览版。这个版本增加了不少新内容,但让我最感兴趣的是其中关于mysql兼容的部分
2022-12-23 22:56:39
2942
原创 【UOS-MogDB】如何在未进入开发者模式的统信UOS上使用Mogeaver
最近有使用UOS桌面办公环境的客户在问,目前MogDB提供的开发工具Mogeaver只有tar包,而UOS使用软件比较严格,未签名的软件无法直接使用,所以希望能有一个能在UOS上使用的deb包。我和同事在网上搜了一下如何编写deb包,然后根据步骤在ubuntu下生成了一个deb包,但实测无法在UOS上使用,不过好在最后找到了办法,因为过程略微曲折,于是写下本文记录操作过程。
2022-12-15 00:42:01
1157
2
原创 【openGauss】在WPS表格里制作连接到openGauss的实时刷新报表
其实我的数据库启蒙,是在一家甲方公司。当时一进这家公司,就见到了通过连接数据库自动刷新的excel表。而我们的国产数据库,是不是也可以通过这种方式制作报表呢?
2022-11-20 00:56:49
704
3
原创 【工具技巧】在windows terminal中保存SSH连接密码(明文)
从2020年开始,网上时不时会刷到windows terminal(缩写wt,下同)这个软件的各种讨论及新闻。这玩意已在新版的win11中,代替了cmd成为了默认的终端软件,而且集成了cmd/powershell,甚至还能自行添加其他终端进去。拥有各种字体、颜色的个性化设置,一时间互联网上无数好评。而且,这个软件是开源的,微软开源。既然是个终端,在windows操作系统上,,一般情况下,几乎很少需要使用cmd或者powershell去执行什么东西,真正用得多的场景应该是ssh连接linux服务器。
2022-11-06 22:48:48
6671
4
原创 【openGauss】两种在openGauss中使用存储过程生成文本文件的方式
在很多使用Oracle数据库的业务应用系统中,尤其是涉及到多个系统需要进行大量数据交互的,如果使用httpapi直接传递表格数据,效率会极其的慢,且很耗应用的计算性能,所以往往会采取用文件的方式来传输大量数据。Oracle中有一个utl_file包,就适用于此场景,在数据库中直接查询出数据,然后写入文件,省去了应用的内存占用,也节省了应用到数据库之间的网络开销。可是,在openGauss中并无utl_file包,那么在openGauss中该如何实现utl_file包的功能呢?
2022-11-06 21:25:10
827
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人