Ggf. schlug hier der Optimizer zu.
Bei einer Funktion, die eine Tabelle zurückgibt, muss diese ja temporär irgendwo incl. ihrer Definition abgelegt werden, damit diese Daten anschließend gelesen werden können.
Temporäre Objekte verschwinden ja nach einem IPL.
Wo nun der Optimizer dieses speichert, entzieht sich mir.
Allerdings deutet der Hinweis, dass native SQL auf der AS/400 die Daten korrekt bekommt, darauf hin, dass es sich rein auf ODBC beschränkt.

ODBC wird über die Hostservices *DATABASE und die PJ's QZDASOINIT verfügbar gemacht.
Da aber PJ's generell wiederverwendet werden, kann es eben auch sein, dass temporäre Objekte erhalten bleiben.

Auch wenn es etwas aufwändiger ist, gibt es eigentlich nur 2 Lösung:
a) Ändert sich die Signatur oder das Ergebnis einer Funktion, so sollte ein neuer Name gewählt werden.
b) Möchte man das nicht ist wohl ein IPL erforderlich. Was auszuprobieren wäre ist ein ENDHOSTSVR *DATABASE, ENDPJ QZDASOINIT, STRHOSTSVR *DATABASE, STRPJ QZDASOINIT.

Lösung a) sollte die favorisierte werden, da sich geändertes Verhalten ggf. massiv auswirkt.
Um sicherzustellen, dass bestehende Programme nicht mit der alten Funktion laufen, die alte Funktion eben löschen und die neue mit neuem Namen erstellen.

Alle betroffenen Programme ggf. halt umwandeln.

Der Vorteil von SQL ist gleichzeitig auch sein Nachteil.
Änderungen sollten immer so gestaltet werden, dass diese bestehende Programme nicht berühren, es sei denn, man möchte einen Crash an den, ggf. vor allem unbekannten Stellen, provozieren.