Das Problem bei solchen Konstrukten ist hier der Optimizer.
Durch die Whereklausel nimmt man an, dass diese in genau der vorgegebenen Reihenfolge abgefragt wird so dass der Datenfehler eigentlich nicht auftreten dürfte.
Der Optimizer dreht aber intern die Abfrage häufig um, so dass es zu unerwarteten Datenfehlern kommt.
Leider gibt es hierzu nur 2 Lösungen:
a) dafür sorgen, dass Datenfehler tatsächlich nicht vorkommen
b) die Abfrage auf Zeichen umstellen

and int(substr(sdind, 12, 3)) = int('002')

wird zu

and substr(sdind, 12, 3) = '002'

das ist auf jeden Fall sicherer.
Ist die Herkunft eines Vergleiches ggf. wiederum eine Variable, so musst du diese dann ich Char casten und ggf. formatieren:
- char(myNumVar)
- Digits(myNumVar)
- substr(Digits/char....)