#include #include #include #include PGconn *conn; PGresult *res; void exit_nicely(int status) { PQfinish(conn); exit(status); } void query(char *qStr) { res = PQexec(conn, qStr); if(res==NULL) { fprintf(stderr, "Error: res==NULL\n"); fprintf(stderr, "Query: %s\n\n", qStr); PQclear(res); exit_nicely(1); } if(PQresultStatus(res)!=PGRES_COMMAND_OK && PQresultStatus(res)!=PGRES_TUPLES_OK) { fprintf(stderr, "Error: %d\n", PQresultStatus(res)); fprintf(stderr, "Query: %s\n\n", qStr); PQclear(res); exit_nicely(1); } } main(int argc, char *argv[]) { char *pghost=NULL, *pgport=NULL, *pgoptions=NULL, *pgtty=NULL; char q[256]; /* abrir la conexión */ conn = PQsetdb(pghost, pgport, pgoptions, pgtty, "grupopg"); if (PQstatus(conn) == CONNECTION_BAD) { fprintf(stderr,"La conexión a 'grupopg' falló.\n"); fprintf(stderr,"%s",PQerrorMessage(conn)); exit_nicely(1); } /* comenzar un bloque transaccional */ query("begin;"); /* PQclear limpia el PGresult cuando ya no se necesita */ PQclear(res); /* meter aqui el choro del ejemplo */ query("declare c cursor for select trim(nombres) as nombres, trim(apellidos) as apellidos, trim(nombre) as empresa from miembros, empresas where empresa=empresas.id;"); PQclear(res); for(query("fetch in c;"); PQntuples(res)>0; PQclear(res), query("fetch in c;")) { printf("%s %s (%s)\n", PQgetvalue(res, 0, 0), PQgetvalue(res, 0, 1), PQgetvalue(res, 0, 2)); } PQclear(res); query("close c;"); PQclear(res); /* cerrar la transacción */ query("commit;"); PQclear(res); exit_nicely(0); return 0; // Sí, ya sé que nunca llegaremos aquí. ¿Y qué? }