void ErrorHandler (void);

#include <stddef.h>                                     // Standardheader
#include <stdio.h>                                      // Standardheader

int main ( int argc, char** argv, char** envp) {
    EXEC SQL BEGIN DECLARE SECTION;                     // Deklarationen-Start

    char serverDatenbank[] = "arnold.uni";              // Server + DB
    char loginPasswort[] = "erika.mustermann";          // User + Passwort
                                                        // Hostvariablen
    int    persnr;                                      // Personalnummer
    char   name[20];                                    // Name
    char   rang[3];                                     // Rang
    int    raum;                                        // Raum
    char   gebdatum[17];                                // Geburtsdatum
    short  raum_ind;                                    // Raum-Indikator

    char eingaberang[3];                                // Eingabe vom User

    EXEC SQL END DECLARE SECTION;                       // Deklarationen-Ende
    EXEC SQL WHENEVER SQLERROR CALL ErrorHandler();     // Fehlermarke
    EXEC SQL CONNECT TO :serverDatenbank                // Verbindung aufbauen
                   USER :loginPasswort;

    if (SQLCODE == 0)                                   // bei Erfolg
        printf("Verbindung zum SQL Server aufgebaut!\n");
    else                                                // bei Misserfolg
    {
        printf("Fehler: Keine Verbindung zum SQL Server!\n");
        return (1);
    }

    printf("Bitte Rang eingeben: ");                    // gewuenschten Rang
    scanf("%s", eingaberang);                           // vom user holen
    printf("Mit Rang %s gespeichert:\n", eingaberang);

    EXEC SQL DECLARE C1 CURSOR FOR                      // Cursor vereinbaren
      SELECT PersNr, Name, Rang, Raum, Gebdatum         // SQL-Statement
      FROM Professoren
      WHERE Rang = :eingaberang;

    EXEC SQL OPEN C1;                                   // Cursor oeffnen
    EXEC SQL FETCH C1 INTO :persnr, :name, :rang,       // Versuche eine Zeile
             :raum INDICATOR :raum_ind, :gebdatum;      // zu lesen

    while (SQLCODE == 0)                                // SOLANGE erfolgreich
    {
      printf("%d %s %s", persnr, name, rang);           // Tupel ausgeben

      if(raum_ind == -1)                                // FALLS keine Raumnr
        printf(" ???");                                 // Platzhalter drucken
      else
        printf("%4d", raum);                            // SONST Raumnr

      printf(" %s\n", gebdatum);                        // letztes Attribut

      EXEC SQL FETCH C1 INTO :persnr, :name, :rang,     // naechste Zeile lesen
        :raum:raum_ind, :gebdatum; 
    }

    EXEC SQL CLOSE C1;                                  // Cursor schliessen
    EXEC SQL DISCONNECT ALL;                            // Verbindung beenden
    return (0);
}

void ErrorHandler (void)
{
    printf("In Error Handler:\n");
    printf("    SQL Code = %li\n", SQLCODE);
    printf("    SQL Server Message %li: '%Fs'\n", SQLERRD1, SQLERRMC);
}