Oracle动态游标执行报错ORA-00911:无效字符问题排查
解决ORA-00911无效字符问题:动态SQL游标执行报错
你遇到的这个ORA-00911错误,核心原因其实很容易忽略——动态SQL语句末尾的分号。
在Oracle中,当你使用OPEN ref_data FOR v_sql这种方式执行动态SQL时,传递的SQL字符串里不能包含语句结尾的分号。这个分号是SQL*Plus、PL/SQL Developer这类客户端工具用来识别语句结束的标记,不属于SQL语句本身的语法部分。
你直接把v_test1和v_test2拼接后在客户端执行时,客户端会自动处理掉末尾的分号,所以语句能正常运行;但通过游标执行动态SQL时,Oracle数据库会把分号当作SQL语句的一部分解析,自然就抛出了“无效字符”的错误。
修复方法
只需要修改动态SQL的结尾部分,把最后那个分号去掉就行:
原来的代码片段:
v_sql := q'| ... WHERE j.Curr IN ('USD', 'EUR', 'GBP', 'CHF') AND Pkg_Jou.Ent_Bal@|' || v_dblink || q'|(Entry) != 0;|';
修改后:
v_sql := q'| ... WHERE j.Curr IN ('USD', 'EUR', 'GBP', 'CHF') AND Pkg_Jou.Ent_Bal@|' || v_dblink || q'|(Entry) != 0|';
额外检查(可选)
如果修改后还是报错,可以检查下动态SQL中有没有隐藏的特殊字符(比如换行、不可见字符),不过根据你描述的“拼接后直接执行正常”的情况,这个概率很低,优先处理分号的问题就好。
内容的提问来源于stack exchange,提问作者Nianios
相关产品推荐
相关产品推荐

