#include #include #include #include EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; short sid; char first[21]; char last[21]; short points; EXEC SQL END DECLARE SECTION; #define N 100 struct { int nonempty; /* 0: no student in this group */ short sid; char first[21]; char last[21]; int sum_points; } group[N]; int main(void) { int g; EXEC SQL CONNECT TO homework; EXEC SQL WHENEVER SQLERROR GOTO error; EXEC SQL DECLARE c1 CURSOR FOR SELECT s.SID, s.FIRST, s.LAST, r.POINTS FROM STUDENTS s, RESULTS r WHERE s.SID = r.SID; EXEC SQL OPEN c1; EXEC SQL WHENEVER NOT FOUND GOTO done; while (1) { EXEC SQL FETCH c1 INTO :sid, :first, :last, :points; if (group[sid % N].nonempty) group[sid % N].sum_points += points; else { group[sid % N].nonempty = 1; group[sid % N].sum_points = points; group[sid % N].sid = sid; strncpy(group[sid % N].first, first, 20); strncpy(group[sid % N].last, last, 20); } } done: EXEC SQL CLOSE c1; for (g = 0; g < N; g++) if (group[g].nonempty) printf("#%d %10s %10s\t %d points\n", group[g].sid, group[g].first, group[g].last, group[g].sum_points); EXEC SQL COMMIT; return 0; error: EXEC SQL WHENEVER SQLERROR CONTINUE; printf ("DB2 error (%d, %s)\n", sqlca.sqlcode, sqlca.sqlstate); if (sqlca.sqlerrml) printf("\t%.*s\n", sqlca.sqlerrml, sqlca.sqlerrmc); EXEC SQL ROLLBACK; return 1; }