Example C/SQL for blocking call on a database alert

main( int argc, char *argv[])
{
  int ret,i;
  char message[40];

  ret = measdb_login();

  if(ret)
  {
    printf("Problems logging onto database !\n");
    exit(1);
  }

  for(;;)
  {

    ret = RegisterAlert("miniramp_alert");  /* register with ORACLE */

    /* the following is a blocking call which waits on the Alert  to fire */

    ret = WaitOnAlert("miniramp_alert",message);

   /* message will contain "MINIRAMP START" or "MINIRAMP STOP" as appropriate. */

    printf("Alert Message: %s\n",message);

    /* loop and re-register */

  }
 
 
  exit(0);

}
 
 
 

int RegisterAlert(char* AlertName)
{

  exec sql begin declare section;
   varchar alname[20];
  exec sql end declare section;
 
  exec sql declare measure database;
  exec sql include sqlca.h;
  exec sql whenever sqlerror goto oraerr;
 

  strcpy((char *)alname.arr,AlertName);
  alname.len = strlen((char *)alname.arr);

  exec sql at measure
    execute
      begin
        dbms_alert.register(:alname);
      end;
    end-exec;

  printf("registered\n");

  return 0;

oraerr:

  oracle_error( __FILE__, &sqlca);

  exec sql whenever sqlerror continue;

  exec sql at measure
    execute
      begin
        dbms_alert.remove(AlertName);
      end;
    end-exec;
 

  return 1;

}
 

int WaitOnAlert(char *AlertName, char *message)
{

  exec sql begin declare section;
    varchar almessage[80];
    varchar alname[20];
    int alstatus;
  exec sql end declare section;
 
  exec sql declare measure database;
  exec sql include sqlca.h;
  exec sql whenever sqlerror goto oraerr;

  strcpy((char *)alname.arr,AlertName);
  alname.len = strlen((char *)alname.arr);

  exec sql at measure
    execute
      begin
        dbms_alert.waitone(:alname,:almessage,:alstatus,300);  /* wait for 300 seconds */

        dbms_alert.waitone(:alname,:almessage,:alstatus,86400000);  /*or wait for ever */

      end;
    end-exec;
 

  if(alstatus)
  {
    printf("alert returned error\n");
  }
  else
  {
    almessage.arr[almessage.len] = '\0';
    strcpy(message,almessage.arr);
  }

  return 0;

oraerr:
  oracle_error( __FILE__, &sqlca);

  exec sql whenever sqlerror continue;

  exec sql at measure
    execute
      begin
        dbms_alert.remove(AlertName);
      end;
    end-exec;

  return 1;

}