资讯动态

IvorySQL Oracle兼容语法完整指南:ROWNUM、ROWID、CONNECT BY层次查询与NLS配置实战

发布时间:2026/10/15 17:50:54 来源:尧图企业网站定制
数据库关系型数据库【免费下载链接】IvorySQLOpen Source Oracle Compatible PostgreSQL.项目地址https://gitcode.com/IvorySQL/IvorySQL点击查看免费下载IvorySQL 是一款基于 PostgreSQL 的开源 Oracle 兼容数据库它通过ivorysql.compatible_mode参数支持在 Oracle 与 PostgreSQL 模式间自由切换。本文带你快速掌握 Oracle 迁移中最常用的四大语法ROWNUM 分页伪列、ROWID 行标识伪列、CONNECT BY 层次查询以及 NLS 日期格式配置帮助你平滑完成从 Oracle 到 IvorySQL 的迁移。1️⃣ 为什么选择 IvorySQLIvorySQL 始终 100% 兼容最新版本的 PostgreSQL同时针对 Oracle 用户的习惯做了深度适配双模式切换通过ivorysql.compatible_modeGUC 参数定义见 src/backend/utils/misc/ivy_guc.c可随时在 Oracle 兼容模式与原生 PostgreSQL 模式之间切换Oracle 语法解析器内置独立的 Oracle 语法解析模块见 src/backend/oracle_parser/ora_gram.y原生识别ROWNUM、ROWID、PRIOR等 Oracle 关键字PL/iSQL 过程语言兼容 Oracle PL/SQL 语法并支持 Oracle 风格的 PackageNLS 兼容参数组提供nls_date_format等一组 Oracle NLS 参数统一归入COMPAT_ORACLE_OPTIONS参数组管理。 提示在原生 PG 模式下无法切换ivorysql.compatible_mode该参数仅在 Oracle 兼容模式相关上下文中生效。2️⃣ ROWNUMOracle 风格的分页与 Top-N 查询ROWNUM是 Oracle 中最经典的伪列IvorySQL 在解析器中原生支持它ROWNUM关键字声明于 src/backend/oracle_parser/ora_gram.y。基础用法-- 取前 5 行 SELECT id, name FROM rownum_test WHERE ROWNUM 5; -- 取第 1 行 SELECT id, name FROM rownum_test WHERE ROWNUM 1; -- 在 SELECT 列表中输出行号 SELECT ROWNUM, id, name FROM rownum_test WHERE ROWNUM 3;Top-N 查询先排序再截断SELECT * FROM ( SELECT id, name, value FROM rownum_test ORDER BY value DESC ) WHERE ROWNUM 3;⚡ 性能亮点IvorySQL 优化器会把ROWNUM谓词自动改写为LIMIT子句实现位于 src/backend/optimizer/plan/planner.c 的transform_rownum_to_limit函数Oracle 写法优化后等价形式WHERE ROWNUM NLIMIT NWHERE ROWNUM 1LIMIT 1WHERE ROWNUM NLIMIT N-1也就是说ROWNUM N这类写法既保持 Oracle 语义又享受 PostgreSQL 级别的 Limit 下推性能迁移代码基本不用改。更多真实用例可参考回归测试 src/oracle_test/regress/sql/rownum.sql 与 PL/iSQL 中的用例 src/pl/plisql/src/sql/plisql_rownum.sql。3️⃣ ROWID精确操作单行的行标识Oracle 的ROWID可用于精确定位某一行。IvorySQL 通过ivorysql.default_with_rowidsGUC 开启 ROWID 伪列支持默认关闭定义见 src/backend/utils/misc/ivy_guc.c。使用步骤-- 1. 开启 ROWID 支持 SET ivorysql.default_with_rowids on; -- 2. 查询时引用 (rowid).rowno 获取行号 SELECT (rowid).rowno, * FROM t2 WHERE (rowid).rowno 3; -- 3. 按 rowid 更新 / 删除 UPDATE t2 SET a a 100 WHERE (rowid).rowno 3; DELETE FROM t2 WHERE (rowid).rowno 1;⚠️ 迁移注意事项均为回归测试 src/oracle_test/regress/sql/ora_rowid.sql 中验证过的行为rowid是保留伪列不能再作为普通列名创建表字段CREATE TABLE t1(rowid int)会报错rowid只读不能INSERT INTO t2(rowid, ...)也不能SET rowid ...表连接时可分别引用(t2.rowid).rowno、(t3.rowid).rowno。4️⃣ CONNECT BY 层次查询树形结构的等价实现Oracle 的START WITH ... CONNECT BY PRIOR是处理组织树、BOM 树等层次数据的利器。需要如实说明当前 IvorySQL 版本尚未原生解析CONNECT BY语法但 PostgreSQL 标准的WITH RECURSIVE递归 CTE 可以完全等价实现性能同样优秀。Oracle 原生写法对照参考SELECT empno, ename, level FROM emp START WITH mgr IS NULL CONNECT BY PRIOR empno mgr;IvorySQL 等价写法WITH RECURSIVE org_tree AS ( -- 递归锚点顶层节点对应 START WITH SELECT empno, ename, mgr, 1 AS lvl FROM emp WHERE mgr IS NULL UNION ALL -- 递归体子节点挂接对应 CONNECT BY PRIOR SELECT e.empno, e.ename, e.mgr, t.lvl 1 FROM emp e JOIN org_tree t ON e.mgr t.empno ) SELECT * FROM org_tree;对照关系一目了然Oracle CONNECT BYIvorySQL 递归 CTESTART WITH 条件WITH RECURSIVE的第一个 SELECTCONNECT BY PRIOR 子列 父列UNION ALL中的JOIN ... ONLEVEL伪列手动维护的lvl 1列 该语法在 src/backend/oracle_parser/ora_gram.y 中同样支持WITH RECURSIVE cte_list生产式Oracle 迁移脚本中的树形逻辑可放心使用。5️⃣ NLS 配置让日期显示像 OracleOracle 用户最熟悉的NLS_DATE_FORMAT等参数IvorySQL 均以同名 GUC 参数实现默认值贴近 Oracle 习惯定义见 src/backend/utils/misc/ivy_guc.c参数名默认值作用nls_date_formatYYYY-MM-DDDATE 类型显示格式nls_timestamp_formatYYYY-MM-DD HH24:MI:SS.FF6TIMESTAMP 显示格式nls_timestamp_tz_formatYYYY-MM-DD HH24:MI:SS.FF6 TZH:TZM带时区 TIMESTAMP 显示格式nls_territory—对应 Oracle NLS_TERRITORYnls_currency/nls_iso_currency—货币符号显示实战示例-- 会话级生效立即影响所有日期输出 SET nls_date_format YYYY-MM-DD HH24:MI:SS; SELECT SYSDATE FROM dual;由于这些参数都是PGC_USERSET级别你可以灵活地在会话级、角色级ALTER ROLE或postgresql.conf全局设置迁移时通常建议写入配置文件让全体应用自动生效。6️⃣ 配套兼容参数速查迁移中经常一并用到的 IvorySQL 兼容参数参数说明ivorysql.compatible_mode核心开关Oracle / PostgreSQL 兼容模式切换ivorysql.enable_emptystring_to_NULLOracle 语义空字符串等价NULLivorysql.enable_case_switch标识符大小写处理策略ivorysql.default_with_rowids开启 ROWID 伪列ivorysql.rowid_seq_cacheROWID 序列缓存大小7️⃣ 延伸资源语法定义src/backend/oracle_parser/ora_gram.yROWNUM 回归测试src/oracle_test/regress/sql/rownum.sqlROWID 回归测试src/oracle_test/regress/sql/ora_rowid.sqlNLS 回归测试src/oracle_test/regress/sql/nls.sql项目中文说明README_CN.md容器化体验docker-compose.yaml写在最后IvorySQL 用原生解析 优化器改写 GUC 参数组三板斧让ROWNUM、ROWID、NLS 配置等 Oracle 核心用法几乎零成本迁移层次查询则可用标准的WITH RECURSIVE平滑替代CONNECT BY。对于从 Oracle 迁移的应用这套组合拳能显著降低 SQL 改写工作量。建议从 docker-compose.yaml 快速搭建一个实例照着本文示例亲手跑一遍迁移之路会顺畅很多 赞分享数据库关系型数据库【免费下载链接】IvorySQLOpen Source Oracle Compatible PostgreSQL.项目地址https://gitcode.com/IvorySQL/IvorySQL点击查看免费下载相关推荐IvorySQL: 开源世界里的Oracle兼容之王IvorySQL: 开源世界里的Oracle兼容之王 在数据库领域选择一款既强大又具备广泛兼容性的解决方案实属不易。而今天我们将要推荐的IvorySQL正TagStudio 搜索语法完全指南从布尔查询语法到底层查询语言实现TagStudio 搜索语法完全指南从布尔查询语法到底层查询语言实现 本文以 TagStudio 的搜索文档 docs/search.md https://桌面应用科研提效指南Awesome Claude Skills 这套 Claude 技能工具链怎么用科研提效指南Awesome Claude Skills 这套 Claude 技能工具链怎么用 读文献读到手软、清洗数据洗到怀疑人生、论文改到最后一遍还是觉得别AI 技能AI 插件人工智能工作流自动化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑