Das ist dann wohl ein Fehler deiner DB2.
Sind die PTF's aktuell?

Ich bekomme auf jeden Fall 0020121016 ausgegeben.

Was die max. Ausprägung angeht, so wird eben die Länge des Feldes für den Cast berücksichtigt.
Wobei man hier nicht von cast spricht da ja Funktionen verwendet werden.

SQL Standard:
cast(value as decimal(8, 0))

DB2
decimal(value, 8, 0)

Nun versucht eben SQL eine Konstante zu analysieren und verwendet den passenden Typ dazu.
Alle Zahlen ohne Nachkomma werden zu Integer (in ILERPG eben 10I => +/- 2^31-1).
Mit Nachkomma oder wenn der Wert zu groß ist werden nach Möglickeit Dezimalfelder (bis max 31/63 Stellen) genommen, wenn das nich passt, dann double.

Komplizierter wirds dann mit CHAR und bei Verwendung im Union-Join.


PS:
Da du ja auf jeden Fall einen 10-Stelligen Wert bekommst, kannst du ja die Positionen im substr anpassen.
Alternativ kannst du auch char(Value) nehmen, solange du eben einen 8-stelligen Wert übergibst, bei "0" gehts dann in die Hose, da char(value) den Wert linksbündig ohne Vornullen ausgibt.