
Dovevo cercare una determinata stringa in una colonna TESTO di una tabella Oracle definita come LONG (contiene informazioni di testo, XML nel mio caso). Un’operazione semplice, pensavo.
Ho utilizzato l’operatore LIKE:
SELECT ID, TESTO FROM TEMPLATE WHERE UPPER(TESTO) LIKE '%LOREM%'
ma con scarso successo, infatti l’errore che si è verificato è il seguente:
ORA-00932: tipi di dati incoerenti: previsto CHAR, ottenuto LONG 00932. 00000 - "inconsistent datatypes: expected %s got %s" *Cause: *Action: Errore alla riga: 2, colonna: 13
Infatti non posso utilizzare l’operatore LIKE su campi LONG (in genere lo uso con i campi VARCHAR2).
Da [1] apprendo che addirittura i campi LONG non possono nemmeno comparire nelle clausole di filtro (WHERE) delle query.
Non solo.
Le colonne di tipo LONG non possono comparire in vincoli di integrità (fatta eccezione per NULL/NOT NULL).
Le colonne di tipo LONG non possono comparire in una espressione regolare.
Ogni tabella può avere al più una colonna di tipo LONG.
Eccetera.
Insomma una serie di condizioni molto vincolanti. Ma soprattutto non posso cercare il testo che voglio.
Il tipo LONG è tuttavia un tipo di dato deprecato in favore del tipo CLOB, atto a contenere testo che eccede i 4000 byte
Sempre in [1] trovo la soluzione: occorre trasformare il dato in un Large Object (LOB). Creo quindi una nuova tabella così:
CREATE TABLE ZZZ_TEMPLATE AS SELECT ID, TO_LOB(TESTO) AS TESTO FROM TEMPLATE; -- Creato table ZZZ_TEMPLATE.
Dunque posso eseguire la query:
SELECT * FROM zzz_template WHERE UPPER(TESTO) LIKE '%LOREM%'; -- 137 "<?xml version="1.0" encoding="ISO-8859-1"?>..." 312 "<?xml version="1.0" encoding="ISO-8859-1"?>..." 311 "<?xml version="1.0" encoding="ISO-8859-1"?>..." 310 "<?xml version="1.0" encoding="ISO-8859-1"?>..."
Commenti recenti