#include #include void printTuples(PGresult *result) { int n = 0, r = 0; int nrows = PQntuples(result); int nfields = PQnfields(result); printf("number of rows returned = %d\n", nrows); printf("number of fields returned = %d\n", nfields); for(r = 0; r < nrows; r++) { for(n = 0; n < nfields; n++) printf(" %s = %s", PQfname(result, n), PQgetvalue(result,r,n), PQgetlength(result,r,n)); printf("\n"); } } void doSQL(PGconn *conn, char *command){ PGresult *result; printf("------------------------------\n"); printf("%s\n", command); result = PQexec(conn, command); printf("status is : %s\n", PQresStatus(PQresultStatus(result))); printf("#rows affected: %s\n", PQcmdTuples(result)); printf("result message: %s\n", PQresultErrorMessage(result)); switch(PQresultStatus(result)) { case PGRES_TUPLES_OK:printTuples(result); break; }/* end switch */ PQclear(result); } int main(){ PGresult *result; PGconn *conn; int nTuples = 0; const char *connection_str = "host=localhost port=5432 dbname=*** user=*** password=***"; conn = PQconnectdb(connection_str); if (PQstatus(conn) == CONNECTION_BAD) { fprintf(stderr, "Connection to %s failed, %s", connection_str, PQerrorMessage(conn)); } else { printf("Connected OK\n"); doSQL(conn, "BEGIN work"); doSQL(conn, "DECLARE mcursor CURSOR FOR SELECT * FROM lab10.person"); do { result = PQexec(conn, "FETCH 1 IN mcursor"); if ( PQresultStatus(result) == PGRES_TUPLES_OK) { nTuples = PQntuples(result); printTuples(result); PQclear(result); } else nTuples = 0; } while (nTuples) ; doSQL(conn, "CLOSE mcursor"); doSQL(conn, "COMMIT work"); } // else // printf("connection failed: %s\n", PQerrorMessage(conn)); PQfinish(conn); return EXIT_SUCCESS; }