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

Liquibase执行PL/SQL遇PLS-00103文件结束符号错误求助

解决Liquibase中PL/SQL Declare-Begin-End块的PLS-00103错误

问题原因

Liquibase默认以分号;作为SQL语句的结束分隔符,但PL/SQL的Declare-Begin-End块内部本身包含多个分号(变量声明、语句结束等),这会导致Liquibase错误地将块拆分成多个不完整的语句,提前终止解析,从而抛出PLS-00103: Encountered the symbol "end-of-file"错误。而SQL Developer会自动识别PL/SQL块的结构,不会被内部分号干扰,所以能正常执行。

解决方案

针对这类PL/SQL块,确实需要调整Liquibase的语句分隔设置,常用两种方式:

  • 方式一:在<sqlFile>标签中指定结束分隔符
    就像你发现的那样,配置<sqlFile endDelimiter="/">,让Liquibase以斜杠/作为整个PL/SQL块的结束标记,这样它会把整个Declare-Begin-End块当作一个完整的语句处理,不会被内部分号拆分。

  • 方式二:使用<sql>标签时关闭语句拆分
    如果是直接在Liquibase的changeSet里用<sql>标签写PL/SQL代码,需要设置splitStatements="false",同时在块末尾加上斜杠:

    <changeSet id="example-plsql" author="your-name">
      <sql splitStatements="false">
        DECLARE
          v_example VARCHAR2(10);
        BEGIN
          v_example := 'test';
          DBMS_OUTPUT.PUT_LINE(v_example);
        END;
        /
      </sql>
    </changeSet>
    

注意事项

  • 不要在PL/SQL块内部的语句末尾省略分号,只需要确保Liquibase用正确的标记识别整个块的结束。
  • 同一changeSet里如果同时有普通SQL和PL/SQL块,建议分开处理,避免分隔符冲突。

内容的提问来源于stack exchange,提问作者nick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:13:31