DDL will protect a file from having bad data written to it, DDS will not. What you are describing though is not the same thing though. The decimal data error is (likely) being generated when the program moves data to the write buffer before the data is written to the database.
Some examples of how to write bad data.
CPYF FMTOPT(*NOCHK) with wrong data format. DDL will stop this if it will cause bad numeric data etc., DDS will not.
Write an RPG Program and use a Program Described file and write blanks to a numeric field. DDL will stop this, DDS will not.
You would get a different error message from the database if you attempted to write bad data to a DDL defined file (perhaps CPF5035).