Joins are almost always preferable to separate table cursor operations.
The key here is to persevere and make sure that you have the correct indexes and proper SQL formulation for every join. With separate cursors and a programmatic join you are coding logic that DB2 already has. Dynamic SQL versus static SQL is an argument as old as DB2 itself. But with DB2's lastest techniques, dynamic SQL can perform very nicely, sometimes outperforming static. If you need to use dynamic SQL be sure to use dynamic SQL caching to avoid the overhead of constantly re-optimizing the SQL at run time.