#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;
}