#include <stdio.h>

EXEC SQL INCLUDE sqlca;

#define SQLNOTFOUND 1403

int check_db(const char *s);

int main()
{
    EXEC SQL BEGIN DECLARE SECTION;
    char user[30] = "scott", pass[30] = "tiger";
    char instanz[30] = "linx";
    int  pers_id = 47080;
    char adr[40];
    EXEC SQL END DECLARE SECTION;

    EXEC SQL CONNECT :user IDENTIFIED BY :pass
        USING :instanz;

    if (check_db("CONNECT"))
        return -1;

    printf("\nConnected to ORACLE as user: %s\n", user);

    EXEC SQL PREPARE stmt_mail FROM
        SELECT adresse, pers_id
            FROM mail_addr
            WHERE pers_id = :a;

    if (check_db("PREPARE stmt_mail"))
        return -1;

    EXEC SQL DECLARE crs_mail CURSOR FOR stmt_mail;
    if (check_db("PREPARE stmt_mail"))
        return -1;

    EXEC SQL OPEN crs_mail USING :pers_id;

    EXEC SQL WHENEVER NOT FOUND DO break;
    for (;;) {
        EXEC SQL FETCH crs_mail INTO :adr, :pers_id;

        printf ("%s %d\n", adr, pers_id);
    }

    EXEC SQL CLOSE crs_mail;

    EXEC SQL COMMIT RELEASE;

    return 0;
}


int check_db(const char *s)
{
    char err_msg[128];
    size_t buf_len, msg_len;
    int dberrno = sqlca.sqlcode;

    if (dberrno != 0) {
        if (dberrno == SQLNOTFOUND) {
            fprintf(stderr, "%s: No data found\n",s);
        } else {
            fprintf(stderr,"Error in %s at %d; error=%d\n",
                s,sqlca.sqlerrd[4],sqlca.sqlcode);

            buf_len = sizeof (err_msg);
            sqlglm(err_msg, &buf_len, &msg_len);
            fprintf(stderr,"%.*s\n", msg_len, err_msg);
        }
    }
    return dberrno;
}
