The PQ-exec function is adequate for submitting commands in simple synchronous applications. It has a couple of major deficiencies however:
PQ-exec waits for the command to be completed. The application may have other work to do (such as maintaining a user interface), in which case it won't want to block waiting for the response.
Since control is buried inside PQ-exec, it is hard for the frontend to decide it would like to try to cancel the ongoing command. (It can be done from a signal handler, but not otherwise.)
PQ-exec can return only one PGresult structure. If the submitted command string contains multiple SQL commands, all but the last PGresult are discarded by PQ-exec.