Actually, it does. Instead of working with statement handles, they have been abstracted away and wrapped in result set objects. There are some fundamental (subtle but very natural) differences: you wouldn't re-execute a result set, for example. It does stick to DBI's iterative approach to fetching, even though many would expect to be able to re-use a result set object and get the same data from it twice. This has not been abstracted, because it would harm performance immensely, especially with databases that don't support rewinding cursors natively.