EXECUTE IMMEDIATE returns wrong record-count.
I have a process where dynamic-sql is more advantageous than parametric DML statements.
In a package, I created DML-scripts (UPDATE ....) and store them in a table including the number of records that would be updated. Once I have all my scripts created, I execute them all using "EXECUTE IMMEDIATE xx-script" individually so that I can compare the number of records updated and the stored count of the number of records. After "EXECUTE IMMEDIATE xx-script" I use "upd_rec_cnt := SQL%ROWCOUNT" to store the number of records that have been updated. Thus I can compare the actual with the expected number of updated records to validate my update.