2010-04-22 10 views
6

Ho un'espressione regolare che genera ORA-12733, "l'espressione regolare è troppo lunga". Come posso determinare qual è la dimensione massima supportata?Oracle - Determina la dimensione massima supportata per l'espressione regolare

FYI: l'espressione regolare incriminata è 892 caratteri. È una regex generata, quindi posso cambiare il modo in cui la genero e la eseguo, ma vorrei sapere quali sono i limiti della dimensione massima prima di cambiare il modo in cui sto generando ed eseguendo.

(in esecuzione Oracle 10.2g)

UPDATE:

Se dipende dalla regex reale, ecco l'inizio di esso (il resto è proprio la stessa cosa ripetuta, con valori diversi tra ^ e $):

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

risposta

8

Guardando la documentazione per le funzioni regex, REGEXP_SUBS TR, REGEXP_INSTR & REGEXP_REPLACE ha la seguente citazione per il modello:

modello è l'espressione regolare. Di solito è un testo letterale e può essere di uno qualsiasi dei tipi di dati CHAR, VARCHAR2, NCHAR o NVARCHAR2. Può contenere fino a 512 byte. Se il tipo di dati del motivo è diverso dal tipo di dati di source_char, Oracle Database converte lo schema nel tipo di dati di source_char. Per un elenco degli operatori è possibile specificare in pattern` **

Tratto da here

+0

Ah, quindi è 512 byte. Grazie! – FrustratedWithFormsDesigner

1

Il campione espressione regolare non dovrebbe bisogno di tutto l'inizio/fine ancore di linea. ^(R_1A|R_2A|R_3A|R_4A|R_4B|R_5A|R_5B)$ funzionerebbe altrettanto bene.

In realtà: se i token di ricerca sono davvero simili come nel campione, si potrebbe desiderare di trarne vantaggio con ^(R_[1-5]A|R_[4-5]B)$ o ^(R_([1-5]A|[4-5]B))$ (per la parte della stringa di ricerca indicata nella domanda).

verificata nel 11.2:

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; 
Problemi correlati