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

如何解决Liquibase执行PL/SQL块时的ORA-00911无效字符异常?

Liquibase执行PL/SQL授权脚本报错ORA-00911的解决方法

问题背景

你的PL/SQL授权脚本在SQL Developer中运行正常,但通过Liquibase执行时抛出ORA-00911: invalid character错误,且已在XML变更集中指定endDelimiter="/",移除execute语句末尾分号也无法解决问题。

解决步骤

  1. 修改变更集配置,关闭语句拆分
    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>
    
  2. 优化execute immediate语句(可选)
    用绑定变量替换字符串拼接,避免潜在的语法错误和SQL注入风险,同时让语句更易维护:

    execute immediate 'grant select, delete on :owner.:table_name to :owner'
        using '${schema}', x.table_name, '${schema}';
    
  3. 验证变量替换结果
    开启Liquibase DEBUG日志,查看实际执行的SQL语句,确认${schema}是否被正确替换,排查是否存在格式错误或多余字符。

错误原因

仅设置endDelimiter="/"不足以处理PL/SQL块,Liquibase仍会按内部分号拆分语句,导致execute语句被错误截断,进而抛出无效字符异常。添加splitStatements="false"后,Liquibase会将整个PL/SQL块作为单条语句处理,配合endDelimiter="/"识别语句结束,即可正常执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:33:16