一尘不染

ORA-12728:正则表达式中的范围无效

sql

我想检查表中是否插入了有效的电话号码,所以我的触发代码在这里:

 select start_index
              into mob_index
              from gmarg_mobile_operators
              where START_INDEX = substr(:new.contact_info,0,3);

              if (REGEXP_LIKE (:NEW.CONTACT_INFO,'^(?:'|| mob_index ||')[\-,\:]{0,1}[0-9][0-9][\-,\:]{0,1}[0-9][0-9][\-,\:]{0,1}[0-9][0-9]')) then
                found := 1;
              end if;

我已经检查了我的正则表达式:“ ^(?: 555)[-,:] {0,1} [0-9] [0-9] [-,:] {0,1} [0-9] [ 0-9]
[-,:] {0,1} [0-9] [0-9]”,这是正确的。

当我运行触发器时,它会成功编译,但是在插入一行期间会显示以下错误:

 insert into GMARG_CONTACTS
(CLINET_ID,CONTACT_INFO,contact_type_id)
values
(0,'555194117','Mobile')
Error report -
SQL Error: ORA-12728: invalid range in regular expression
ORA-06512: at "HR.GMARG_TRIGGER_CONTACT", line 12
ORA-04088: error during execution of trigger 'HR.GMARG_TRIGGER_CONTACT'
12728. 00000 -  "invalid range in regular expression"
*Cause:    An invalid range was found in the regular expression.
*Action:   Ensure a valid range is being used.

因此,如果我的正则表达式正确,为什么oracle会显示错误?我试图找到答案,或者重新定义我的正则表达式,但是没有前进的步骤……在此先感谢您


阅读 412

收藏
2021-03-17

共1个答案

一尘不染

正则 表达式 不要在方 括号表达式中 使用\保护。您只需将第一个字符放在开头的括号之后:- __-

IF REGEXP_LIKE('--,,::', '[\-,:]*')
...

=> ORA-12728: invalid range in regular expression

如果您很好奇,在遇到[\-,:]Oracle时请理解:
“范围从\,或字符之间的任何字符:。为什么这引发了一个异常的原因是\似乎是
,根据自己的ASCII值。而且Oracle不接受在结束值之后具有起始值的 范围

另一方面:

 IF REGEXP_LIKE('--,,::', '[-,:]*')

可以正常工作。


作为一个侧面说明,[-,:]{0,1}意为 _“零或一发生-,:”_可以写[-,:]?

2021-03-17