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

时间:2014-09-28 20:31:39

标签: sql regex oracle

我想检查表中是否插入了有效的电话号码,因此我的触发器代码在此处:

 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显示错误? 我试图找到答案,或者重新定义我的正则表达式,但没有前进的步骤...... 提前谢谢你

1 个答案:

答案 0 :(得分:3)

正则表达式不使用\来保护括号表达式中的- 。您只需将-作为第一个字符,就在左括号之后:

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

=> ORA-12728: invalid range in regular expression

如果您有点好奇,遇到[\-,:]时,Oracle会理解:" \,范围内的任何字符或字符{{ 1}}" 。这引发异常的原因是:根据其ASCII值在 \之后显示为。并且Oracle不接受在结束后具有起始值的范围

另一方面:

,

按预期工作。

<小时/> 作为旁注, IF REGEXP_LIKE('--,,::', '[-,:]*') 表示&#34;出现[-,:]{0,1}-,&#34; 可以写成: