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
相关产品推荐
相关产品推荐

