I am wondering If I am missing something obvious. If not, I have a suggestion for plpgsql.
Stored procedures can accept rows.
Libpq can receive rows (PQResult).
Wouldn't it be a great interface if PQResult was "bi-directional"? Create a result set on the client then call the database with a command.
Perhaps...
PQinsert(PQResult,"schema.table"); //iterate thru rows inserting
PQupdate(PQResult,"schema.table"); //iterate thru rows updateing
PQexec(connection,"scheme.function",PQResult) //iterate thru rows passing row as arg to stored procedure.