You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Liquibase中为单行SQL统一使用endDelimiter:/的问题咨询

问题分析与解决方案

错误原因

你遇到的ORA-00933: SQL not properly ended是因为重复的语句终止符:当在changeset里指定endDelimiter:/后,Liquibase会用/来拆分SQL语句,但你的代码里同时保留了分号(;)和/,导致Oracle收到的语句末尾包含多余的分号,触发语法错误。

关于统一使用/作为分隔符的可行性

可以实现,但需要调整代码写法:
去掉普通DDL语句末尾的分号,只保留/作为语句终止符,示例如下:

--liquibase formatted sql
--changeset test:1 endDelimiter:/

CREATE OR REPLACE PUBLIC SYNONYM XXXX FOR XXX
/
GRANT EXECUTE ON XXXX TO XXXX
/
--rollback not required; 

此时Liquibase会以/为分隔符,将每个独立的SQL语句发送给Oracle,Oracle能正确解析执行。

更合理的分隔符使用方案

结合你的部署工具要求(存储逻辑与普通SQL分文件),**仅对存储过程、函数、触发器等含PL/SQL逻辑的代码使用endDelimiter:/**是更常规且不易出错的做法:

  • 普通DDL文件(创建同义词、授权、表结构等):使用默认的分号(;)作为分隔符,代码末尾加;即可,无需额外加/。
  • PL/SQL存储对象文件(过程、函数、触发器):指定endDelimiter:/,内部PL/SQL块用分号终止单行语句,整个对象定义末尾用/作为整体结束标记。

这种方式既符合工具的文件拆分规则,又能避免因终止符混用导致的语法错误,同时逻辑清晰,便于维护。

内容的提问来源于stack exchange,提问作者Joaquín S. Britos Morales

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 12:44:57