2010-04-22 15 views
6

ORA-12733'ü "düzenli ifade çok uzun" yazan normal bir ifadem var. Desteklenen maksimum boyutun ne olduğunu nasıl belirlerim?Oracle - Düzenli ifade için desteklenen maksimum boyutu belirleme

FYI: sorunlu normal ifade 892 karakterdir. Oluşturulan bir regex, bu yüzden nasıl oluşturduğumu ve yürüttüğümü değiştirebilirdim, ancak ben üretme ve yürütme şeklimi değiştirmeden önce, maksimum boyuttaki sınırların ne olduğunu bilmek istiyorum.

(Oracle 10.2g çalıştıran)

GÜNCELLEME:

gerçek regex bağlıdır, burada bunun başlangıcı (dinlenme ^ arasında farklı değerlere sahip, tekrarlanan sadece aynı şeydir bulunuyor ve $):

(^R_1A$|^R_2A$|^R_3A$|^R_4A$|^R_4B$|^R_5A$|^R_5B$ ...

cevap

8

regex fonksiyonlar, REGEXP_SUBS için belgelere baktığımızda

desen düzenli ifadedir: TR, REGEXP_INSTR & REGEXP_REPLACE o modeli için aşağıdaki alıntı vardır. Genellikle bir metin literaldır ve veri türlerinden CHAR, VARCHAR2, NCHAR veya NVARCHAR2'den olabilir. En çok 512 bayt içerebilir. Modelin veri türü, source_char veri türünden farklı ise, Oracle Veritabanı modelini source_char veri tipine dönüştürür. operatörlerin bir listesi için sen **

hat çapa tüm başlangıç ​​/ son gerekmez here

+0

Aha, bu nedenle 512 bayt bu. Teşekkürler! – FrustratedWithFormsDesigner

1

örnek regex Alındığı pattern` içinde belirtebilirsiniz. ^(R_1A|R_2A|R_3A|R_4A|R_4B|R_5A|R_5B)$ sadece iyi çalışıyordu.

Aslında: Arama jetonları örnekte olduğu gibi gerçekten benzerse, ^(R_[1-5]A|R_[4-5]B)$ veya ^(R_([1-5]A|[4-5]B))$ (arama dizgisinin sorunda verilen kısmı için) ile bunlardan yararlanmak isteyebilirsiniz. 11.2 yılında

Onaylı:

SELECT i, t FROM (
    SELECT 1 i, 'R_1A' t FROM DUAL UNION ALL 
    SELECT 2, 'xR_2A' FROM DUAL UNION ALL 
    SELECT 3, 'R_3Ax' FROM DUAL UNION ALL 
    SELECT 4, 'xR_4Ax' FROM DUAL UNION ALL 
    SELECT 5, 'R_4B' FROM DUAL UNION ALL 
    SELECT 6, 'R_5A' FROM DUAL UNION ALL 
    SELECT 7, 'R_5B' FROM DUAL) 
--WHERE REGEXP_LIKE(t, '(^R_1A$|^R_2A$|^R_3A$|^R_4A$|^R_4B$|^R_5A$|^R_5B$)') 
--WHERE REGEXP_LIKE(t, '^(R_1A|R_2A|R_3A|R_4A|R_4B|R_5A|R_5B)$') 
--WHERE REGEXP_LIKE(t, '^(R_[1-5]A|R_[4-5]B)$') 
WHERE REGEXP_LIKE(t, '^(R_([1-5]A|[4-5]B))$') 
ORDER BY i;