源代码:大批量SQL代码语法转换简单实例:ORACLE START WITH CONNECT 语法改写

本文涉及的产品
RDS AI 助手,专业版
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 大批量SQL代码语法转换简单实例:ORACLE START WITH CONNECT 语法改写

### 背景:在不同数据库迁移的项目中,往往会遇到SQL语法不兼容的情况。

### 问题:如果存在大量代码需要改写的情况,靠人工处理会很耗时,且容易出错。能不能通过工具实现代码语法的大批量自动转换?

### 方案:可以使用开源代码解析器 ZGLanguage 对SQL代码进行大批量自动转换

### 案例演示:

# 假设 ORACLE START WITH CONNECT 语法代码( start_with_connect.sql ):

SELECT *
FROM tree 
START WITH id = 1
CONNECT BY NOCYCLE PRIOR id = parentid
;

# 配置转换规则可以将以上代码直接转换成如下代码(改写成with recursive语法):

with recursive wr_tree as 
( 
SELECT id, parentid, 1 as level from tree where id = 1 
union 
SELECT tree.id, tree.parentid, level + 1 from tree, wr_tree where tree.parentid = wr_tree.id 
) 
SELECT * from wr_tree order by id
;

# 转换规则( STATR_WITH_CONNECT_SQL_REPLACE.syn )如下所示:

__DEF_FUZZY__             Y
__DEF_DEBUG__             N
__DEF_CASE_SENSITIVE__    N
 
__DEF_LINE_COMMENT__      -- 
__DEF_LINES_COMMENT__     /*     */
 
 
__DEF_STR__   __IF_KW__
<1,100>
[1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
[0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_
        
 
__DEF_PATH__    __START_WITH_CONNECT__
1             : sel        @ %__IF_KW__            | select
              : cc         @                       | *
              : frm        @                       | from
              : srctab     @                       | __NAME__
              : sta        @ %__IF_KW__            | start
              : wth        @ %__IF_KW__            | with
              : swp        @                       | __NAME__
              : dy1        @                       | =
              : int        @                       | __INT__
              : str        @                       + __STRING__
              : cnn        @ %__IF_KW__            | connect
              : by         @ %__IF_KW__            | by
              : ncy        @ %__IF_KW__ CAN_SKIP   | nocycle
              : prr1       @ %__IF_KW__ CAN_SKIP   | prior
              : col1       @                       | __NAME__
              : dy         @                       | =
              : col2       @                       | __NAME__
              : end        @                       | ;
-----------------------------------------------------------------------
1             : sel        @                       | with
              : sel        @                       | recursive
              : sel        @                       | wr_
              : srctab     @                       \ __NAME__
              : sel        @ STRING                | as
              : sel        @                       | __\n__
              : sel        @                       | (
              : sel        @                       | __\n__
              : sel        @                       | select
              : col1       @                       / __NAME__
              : col2       @                       \ ,
              : col2       @                       / __NAME__
              : sel        @ STRING                \ , 1 as level from
              : srctab     @                       / __NAME__
              : sta        @                       / where
              : swp        @                       / __NAME__
              : dy1        @                       / =
              : int        @                       / __INT__
              : str        @                       / __STRING__
              : sel        @                       | __\n__
              : sel        @                       | union
              : sel        @                       | __\n__
              : sel        @                       | select
              : srctab     @                       / __NAME__
              : srctab     @                       \ .
              : col1       @                       \ __NAME__
              : col2       @                       \ ,
              : srctab     @                       / __NAME__
              : srctab     @                       \ .
              : col2       @                       \ __NAME__
              : sel        @ STRING                \ , level + 1 from
              : srctab     @                       / __NAME__
              : srctab     @                       \ ,
              : sel        @                       / wr_
              : srctab     @                       \ __NAME__
              : sta        @                       / where
              : srctab     @                       / __NAME__
              : srctab     @                       \ .
              : col2       @                       \ __NAME__
              : dy1        @                       / =
              : sel        @                       / wr_
              : srctab     @                       \ __NAME__
              : srctab     @                       \ .
              : col1       @                       \ __NAME__
              : sel        @                       | __\n__
              : sel        @ STRING                | )
              : sel        @                       | __\n__
              : sel        @                       | select
              : sel        @                       | *
              : sel        @ STRING                | from
              : sel        @                       | wr_
              : srctab     @                       \ __NAME__
              : sel        @                       / order
              : sel        @                       / by
              : col1       @                       / __NAME__
              : end        @                       | ;
 
 
__DEF_STR__   __NAME__
<1,100>
[1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_??
[0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_??
[NO] create insert update delete truncate drop merge table select inner left join on from where group order partition by having union all with as set between and or like in is not null case when then pivot lateral view 
 
 
__DEF_STR__   __INT__
<1,100>
[1,100]0123456789
 
 
__DEF_SUB_PATH__   __STRING__
1       : x1                  | '
        : x2                  | __ANY__
        : x3                  | '


# 执行方式: ZGLanguage -e STATR_WITH_CONNECT_SQL_REPLACE.syn -r start_with_connect.sql -o result.sql


相关文章
|
5月前
|
存储 人工智能 Cloud Native
上市大模型企业数据基础设施的选择:MiniMax 基于阿里云 SelectDB 版,打造全球统一AI可观测中台
MiniMax 作为上市大模型企业,基于阿里云 SelectDB 打造 AI 可观测中台,实现“一个平台,全球覆盖”。这一成功实践足以表明:SelectDB 能够很好满足 AI 时代海量数据实时处理与分析的需求,为同样需求的 AI 大模型企业提供了一个高性能、低成本的可靠技术解决方案。
447 5
上市大模型企业数据基础设施的选择:MiniMax 基于阿里云 SelectDB 版,打造全球统一AI可观测中台
|
4月前
|
存储 人工智能 测试技术
基于 VectorDBBench 的性能评测与架构解析:Lindorm 向量引擎的优化实践
阿里云Lindorm向量检索服务重磅升级,依托CBO/RBO混合优化器与自适应混合索引,实测QPS达5.6万(百万级)、2.4万+(千万级),P99延迟低至2ms,融合检索性能行业领先,全面支撑AI时代高并发、低延迟、强一致的生产级向量应用。
655 4
|
3月前
|
JSON API 开发者
实战指南:使用API高效获取纳斯达克股票数据
本文为开发者提供纳斯达克股票数据API实战指南:支持实时行情、历史K线(1分钟至日线)、公司基本面及IPO日历等全维度数据;仅需`countryId=5`即可接入,统一JSON返回,附Python示例与WebSocket低延迟方案。(239字)
|
6月前
|
SQL Oracle 关系型数据库
Oracle 数据塑形:行列转换与集合运算
报表要求的数据格式总是千奇百怪?其实用SQL就能让数据轻松“变形”。想把多行内容(比如各科成绩)合并成一行里的多列,可以用经典的CASE WHEN,或者在11g以上版本里用更简洁的PIVOT。反过来,把宽表拆成多行,也有UNION ALL和更方便的UNPIVOT。学会这些,再配合UNION、INTERSECT等集合运算,数据就能随心所欲地展示了。
558 14
|
4月前
|
人工智能 缓存 知识图谱
互联网医院AI问诊系统架构设计:从智能分诊到在线诊疗的完整链路
本文详解互联网医院AI问诊系统落地实践:直击无效咨询多、分诊低效、医生负荷重等核心瓶颈,以微服务架构+AI独立部署为基座,覆盖智能分诊、结构化问诊、知识图谱+规则引擎、病历自动生成及高并发保障,实测降低医生工作量50%、提升分诊准确率至85%+。(239字)
|
4月前
|
人工智能 运维 关系型数据库
Moltbot实战:MoltBot+RDS AI助手Skill管理RDS实例
本文介绍如何5分钟快速对接Moltbot与阿里云RDS AI助手,打造专属AI数据库运维管家。通过开源Skill实现自动化诊断、参数调优、索引优化等能力,解放DBA于凌晨救火,让重复运维交给AI,专注高价值架构设计。(239字)
Moltbot实战:MoltBot+RDS AI助手Skill管理RDS实例
|
5月前
|
人工智能 关系型数据库 分布式数据库
不止于云原生:阿里云PolarDB全面内化AI能力,构建AI就绪的下一代数据库架构
2026阿里云 PolarDB 开发者大会上,PolarDB 发布 AI 数据湖库(Lakebase)等全新能力,推出“AI 就绪的云原生数据库”四大支柱,推动数据库从“外挂式”集成 AI 到“内生智能”的进化,赋能 Agent 应用开发,助力企业实现智能决策与业务跃迁。
|
人工智能 自然语言处理 数据挖掘
国内如何使用微软 Copilot ?新手进阶篇!
微软 Copilot 是一款功能强大的 AI 助手,掌握一些使用技巧,可以让它成为你工作和生活中的得力助手,助你提升效率,激发创造力,开启更加精彩的人生!
|
存储 负载均衡 关系型数据库