如何解决Liquibase执行PL/SQL块时的ORA-00911无效字符异常?
Liquibase执行PL/SQL授权脚本报错ORA-00911的解决方法
问题背景
你的PL/SQL授权脚本在SQL Developer中运行正常,但通过Liquibase执行时抛出ORA-00911: invalid character错误,且已在XML变更集中指定endDelimiter="/",移除execute语句末尾分号也无法解决问题。
解决步骤
修改变更集配置,关闭语句拆分
Liquibase默认会按分号拆分SQL语句,但PL/SQL块内部包含多个分号,必须明确告知Liquibase不要拆分语句。在<sql>标签中添加splitStatements="false":<changeSet id="grant_table_permissions" author="your_author"> <sql endDelimiter="/" splitStatements="false"> begin for x in (select table_name from dba_tables where owner='${schema}') loop execute immediate 'grant select, delete on ${schema}.' || x.table_name || ' to ${schema}'; end loop; end; / </sql> </changeSet>优化execute immediate语句(可选)
用绑定变量替换字符串拼接,避免潜在的语法错误和SQL注入风险,同时让语句更易维护:execute immediate 'grant select, delete on :owner.:table_name to :owner' using '${schema}', x.table_name, '${schema}';验证变量替换结果
开启Liquibase DEBUG日志,查看实际执行的SQL语句,确认${schema}是否被正确替换,排查是否存在格式错误或多余字符。
错误原因
仅设置endDelimiter="/"不足以处理PL/SQL块,Liquibase仍会按内部分号拆分语句,导致execute语句被错误截断,进而抛出无效字符异常。添加splitStatements="false"后,Liquibase会将整个PL/SQL块作为单条语句处理,配合endDelimiter="/"识别语句结束,即可正常执行。
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

