Oggi ho dovuto affrontare un errore in una query per Oracle. L'errore era:
ORA-00907: parentesi chiusa mancante
Non proprio comprensibile...
La prima cosa che ho fatto è stata di controllare tutte le parentesi, tutte correttamente annidate e chiuse. Allora ho provato a indentarla in maniera corretta, visto che nell'errore di Oracle veniva riportata in maniera tutt'altro che leggibile. Ma ancora nulla. Allora ho cominciato a cancellare pezzi singolarmente, in maniera da ridurre il codice sql e individuare quale parte desse l'errore. E poi ho notato una cosa non proprio carina, tre apici in successione. Una cosa di questo tipo:
select * from table where column = replace(string, ''', '');
La funzione replace() ovviamente permette di sostituire un carattere con un altro all'interno di una stringa, ma ovviamente quel ''' da errore. Ho pensato di poter fare l'escape dell'apice interno con un backslace (\). Nulla di fatto.
Allora ho cominciato una piccola ricerca che ha prodotto questo risultato:
www.mydigitallife.info/2007/03/24/how-to-escape-characters-in-oracle-plsql-queries/
In pratica si dice di segnalare nella query stessa qual'è il carattere utilizzato per l'escape:
SELECT * FROM table WHERE column LIKE '%\_%' ESCAPE '\';
Poco sotto, però, viene affermato che questo metodo non funziona per fare l'escape dell'apice singolo. In quel momento m'è venuto in mente di usare un trucchetto per "non far vedere" a Oracle che carattere sto cercando nella mia stringa. E ho trasformato la mia query in questa:
select * from table where column = replace(string, chr(39), '');
chr(code) è la funzione che dice ad Oracle di sostituire il codice con il carattere corrispondente. (trovate una tabella delle corrispondenze
qui)
La soluzione prospettata invece nell'articolo è quella di aggiungere un ulteriore apice davanti a quello di cui fare l'escape. Quindi il ''' diventa ''''.