关于使用REGEXP_SUBSTR函数时触发ORA-01722: invalid number错误的技术问询
解决ORA-01722: invalid number错误——REGEXP_SUBSTR参数误用分析
你碰到的这个错误,根源其实很直接:你把REGEXP_SUBSTR的参数顺序搞混了,和你的NLS_NUMERIC_CHARACTERS配置完全没关系。
先给你掰清楚Oracle里REGEXP_SUBSTR的常用参数逻辑:REGEXP_SUBSTR(源字符串, 正则模式, 起始搜索位置, 匹配次数, 匹配参数)
这里第三个参数要求是数字类型(指定从第几个字符开始搜),但你传了字符串'n'——Oracle试图把这个字符串转成数字时自然失败,直接抛出了ORA-01722错误。
你应该是想使用'n'作为匹配参数(用来开启不区分大小写匹配),这个参数是放在第五位的,前面需要补全默认的起始位置(1)和匹配次数(1)。
修复方案1:纠正参数顺序
把参数补全到正确的位置,执行后就能得到你想要的不区分大小写匹配结果:
WITH aux ( str ) AS ( SELECT 'A b s d' FROM dual ) SELECT regexp_substr(str, 'a', 1, 1, 'n') reg FROM aux;
这个语句会返回A,符合预期。
修复方案2:使用命名参数(Oracle 12c+)
如果怕记混参数顺序,更稳妥的方式是用命名参数,直接指定每个参数的作用,可读性更强:
WITH aux ( str ) AS ( SELECT 'A b s d' FROM dual ) SELECT regexp_substr( source_string => str, pattern => 'a', match_parameter => 'n' ) reg FROM aux;
总结一下:这个错误完全是参数位置/类型不匹配导致的,和数字格式配置无关,调整参数顺序或使用命名参数就能解决。
内容的提问来源于stack exchange,提问作者user15746603
相关产品推荐
相关产品推荐

