PRO*C Wizards and Users Help Wanted

From: George <ghharrac_at_ouray.Denver.Colorado.EDU>
Date: 15 Oct 1994 07:09:55 GMT
Message-ID: <37nv83$787_at_carbon.denver.colorado.edu>


/*

      This is a question for all you PRO*C Wizards !!!

      The first section runs( no oracle errors or wedges), but 
      the second section generates a oracle error at run time.
      The code in both examples uses two cursors.

      SUN, PRO*C 1.5

      Both sections of code perform the same function, taken from
      a oracle sample.

      The second sample is modular  :)

      Give it your best shot, I need help on this simple task :(
      Maybe I have made a dumb mistake in the code, I have not
      one looking myself.


      ghharrac_at_ouray.denver.colorado.edu

      Oct 14, 1994

*/
/**************************************************************************/
/**************************************************************************/
/*                    CUT HERE                                            */
/**************************************************************************/
/**************************************************************************/
                                                                                
                                                                                

#include <stdio.h>
#include <ctype.h>
#include <string.h>
EXEC SQL BEGIN DECLARE SECTION;                                                 
    VARCHAR        username[21];                                                

    /* let us take a very simple query */                                       

char *query  = "Select * from REPORT ";                       
char *query2 = "SELECT * FROM CLIENT_REQUEST";
EXEC SQL END DECLARE SECTION;                                                   
                                                                                
EXEC SQL INCLUDE sqlca.h;                                                       
EXEC SQL INCLUDE sqlda.h;                                                       
                                                                                
SQLDA *bind_dp;                                                                 
SQLDA *select_dp;                                                               
SQLDA *bind_dp2;
SQLDA *select_dp2;
extern SQLDA *sqlald();                                                         
extern SQLDA *sqlclu();                                                         


void query_one ( void );
void query_two ( void );

/**************************************************************************/

main ()                                                                         
{                                                                               
    int i = 0;                                                                  
    short l;                                                                    
                                                                                
    /* Set up Oracle error handling */                                          
    EXEC SQL WHENEVER SQLERROR GOTO sqlerror;                                   
                                                                                
    /* Logon to Oracle */                                                       
    strcpy (username.arr, "RDF/RDF");                                       
    username.len = strlen(username.arr);                                        
    EXEC SQL CONNECT :username;                                                 
                                                                                
    /* allocate the bind and select descriptor */                               
    bind_dp   = sqlald (40, 30, 30);
    select_dp = sqlald (40, 30, 30);                                            
                                                                                

    bind_dp2 = sqlald (40, 30, 30);
    select_dp2 = sqlald (40, 30, 30);

    /* Prepare the statement and Declare a cursor */

    EXEC SQL PREPARE S FROM :query;     EXEC SQL PREPARE S2 FROM :query2;

    EXEC SQL DECLARE C CURSOR FOR S;                                            
    EXEC SQL DECLARE C2 CURSOR FOR S2;                                            
                                                                                
    EXEC SQL DESCRIBE BIND VARIABLES FOR S INTO bind_dp;                        
    EXEC SQL DESCRIBE BIND VARIABLES FOR S2 INTO bind_dp2;
                                                                                
    /* Set the max number of array elements to the number found */              
    bind_dp->N = bind_dp->F;                                                    
    bind_dp2->N = bind_dp2->F;                                                    
                                                                                
    EXEC SQL OPEN C USING DESCRIPTOR bind_dp;                                   
    EXEC SQL OPEN C2 USING DESCRIPTOR bind_dp2;

    EXEC SQL DESCRIBE SELECT LIST FOR S INTO select_dp;     EXEC SQL DESCRIBE SELECT LIST FOR S2 INTO select_dp2;

                                                                                
    /* Set the max number of elements in descriptor to that found */            
    select_dp->N = select_dp->F;                                                
    select_dp2->N = select_dp2->F; 
                                                                                

    for ( i = 0 ; i < select_dp->N; i++ )
      select_dp->V[i] = (char *)malloc(select_dp->L[i]);

    for ( i = 0 ; i < select_dp2->N; i++ )
      select_dp2->V[i] = (char *)malloc(select_dp2->L[i]);
                                                                                

    query_one ();

    query_two ();

    end_main:                                                                   
        printf ("\n\n# of rows processed = %d\n", sqlca.sqlerrd[2]);

    for (i = 0; i < select_dp-> F; i++)                                        
    {                                                                           
        free (select_dp->V[i]);                                                 
        free (select_dp->I[i]);                                                 
    }                                                                           
                                                                                
    for (i = 0; i < select_dp2-> F; i++)                                        
    {                                                                           
        free (select_dp2->V[i]);
        free (select_dp2->I[i]);
    }
                                                                           
    /* Free up space used by the descriptors themselves */                      
    sqlclu (bind_dp);                                                           
    sqlclu (select_dp);                                                         
    sqlclu (bind_dp2);
    sqlclu (select_dp2);
                                                                                
    EXEC SQL CLOSE C;                                                           
    EXEC SQL CLOSE C2;
    EXEC SQL COMMIT WORK RELEASE;                                               
    return;                                                                     
                                                                                
    /* Oracle Error Handler */                                                  
    sqlerror:                                                                   
        printf ("\n%.70s",sqlca.sqlerrm.sqlerrmc);                              
        EXEC SQL WHENEVER SQLERROR CONTINUE;                                    
        EXEC SQL ROLLBACK WORK RELEASE;                                         
        return;                                                                 
    } /* end of program */                                                      
                                                                                

/*****************************************************************************/

void query_one ( void )
{
  int i;

#ifdef HEADERS

    for ( i = 0 ; i < select_dp->N; i++ )     printf("%-*.*s ",(int)select_dp->L[i],(int)select_dp->L[i],select_dp->S[i]);     printf ("\n\n");
#endif

                                                                                
    EXEC SQL WHENEVER NOT FOUND GOTO end_main;                                  
    for ( ; ; )                                                                 
    {                                                                           
        EXEC SQL FETCH C USING DESCRIPTOR select_dp;                            
                                                                                
        for ( i = 0 ; i < select_dp->N; i++ )
        {
          if ( select_dp->L[i] > 20 )
          {
            select_dp->V[i][20]= (char)NULL;
          }
          else
          {
            select_dp->V[i][select_dp->L[i]] = (char)NULL;
          }
          printf("%s ",select_dp->V[i]);                        
        }
        printf ("\n");                                                          
    }                                                                           
                                                                                
    end_main:                                                                   
        printf ("\n\n# of rows processed = %d\n", sqlca.sqlerrd[2]);

}

/*****************************************************************************/

void query_two ( void )
{
  int i;

#ifdef HEADERS

    for ( i = 0 ; i < select_dp2->N; i++ )

      printf("%-*.*s ",(int)select_dp2->L[i],(int)select_dp2->L[i],
                      select_dp2->S[i]);
    printf ("\n\n");                                                            

#endif
EXEC SQL WHENEVER NOT FOUND GOTO end_main; for ( ; ; ) { EXEC SQL FETCH C2 USING DESCRIPTOR select_dp2; for ( i = 0 ; i < select_dp2->N; i++ ) { if ( select_dp2->L[i] > 20 ) { select_dp2->V[i][20]= (char)NULL; } else { select_dp2->V[i][select_dp2->L[i]] = (char)NULL; } printf("%s ",select_dp2->V[i]); } printf ("\n"); } end_main: printf ("\n\n# of rows processed = %d\n", sqlca.sqlerrd[2]);

}

/**************************************************************************/
/**************************************************************************/
/*                    CUT HERE                                            */
/**************************************************************************/
/**************************************************************************/


#include <stdio.h>
#include <ctype.h>
#include <string.h>
EXEC SQL BEGIN DECLARE SECTION;                                                 
    VARCHAR        username[21];                                                

    /* let us take a very simple query */                                       

char *query  = "SELECT * from REPORT ";                       
char *query2 = "SELECT * FROM CLIENT_REQUEST";
EXEC SQL END DECLARE SECTION;                                                   
                                                                                
EXEC SQL INCLUDE sqlca.h;                                                       
EXEC SQL INCLUDE sqlda.h;                                                       
                                                                                
SQLDA *bind_dp;                                                                 
SQLDA *select_dp;                                                               
SQLDA *bind_dp2;
SQLDA *select_dp2;
extern SQLDA *sqlald();                                                         
extern SQLDA *sqlclu();                                                         

void query_one          ( void );
void query_two          ( void );
void prepare_select_one ( void );
void prepare_select_two ( void );
void free_cursor_one    ( void );
void free_cursor_two    ( void );
void build_cursor_one   ( void );
void build_cursor_two   ( void );
void connect            ( void );
void error              ( char * mess );

/**************************************************************************/

main ()                                                                         
{                                                                               
  int i = 0;                                                                  
  short l;                                                                    
                                                                              
  connect ();
                                                                              

  build_cursor_one ();

  build_cursor_two ();

  prepare_select_one();

  prepare_select_two();                                                                               

  query_one ();

  query_two ();

  free_cursor_one ();                                                                               

  free_cursor_two ();

  EXEC SQL COMMIT WORK RELEASE; }                                                                               

/********************************************************************/

void error( char *mess )
{
  printf ("Module: %s\n",mess);

  printf ("%.70s\n",sqlca.sqlerrm.sqlerrmc);                              
  EXEC SQL WHENEVER SQLERROR CONTINUE;                                    
  EXEC SQL ROLLBACK WORK RELEASE;                                         
  exit ( 0 );                                                                 
}
                                                                                
/********************************************************************/


void connect ( void )
{

    /* Logon to Oracle */                                                       
EXEC SQL WHENEVER SQLERROR GOTO sqlerror;                                   
    strcpy (username.arr, "RDF/RDF");                                       
    username.len = strlen(username.arr);                                        
    EXEC SQL CONNECT :username;                                                 
    return;
sqlerror:

    error ( "connect" );
}

/**************************************************************************/

void build_cursor_one ( void )
{

EXEC SQL WHENEVER SQLERROR GOTO sqlerror;

  bind_dp = sqlald (40, 30, 30);

  select_dp = sqlald (40, 30, 30);

  EXEC SQL PREPARE S FROM :query;

  EXEC SQL DECLARE C CURSOR FOR S;   EXEC SQL DESCRIBE BIND VARIABLES FOR S INTO bind_dp;

  bind_dp->N = bind_dp->F;

  EXEC SQL OPEN C USING DESCRIPTOR bind_dp;

  EXEC SQL DESCRIBE SELECT LIST FOR S INTO select_dp;

  return;

sqlerror:
  error ("build_cursor_one");
}

/**************************************************************************/

void build_cursor_two ( void )
{

  EXEC SQL WHENEVER SQLERROR GOTO sqlerror;                                   
                                                                                

  bind_dp2 = sqlald (40, 30, 30);

  select_dp2 = sqlald (40, 30, 30);

  EXEC SQL PREPARE S2 FROM :query2;

  EXEC SQL DECLARE C2 CURSOR FOR S2;                                            
                                                                              
  EXEC SQL DESCRIBE BIND VARIABLES FOR S2 INTO bind_dp2;
                                                                              
  /* Set the max number of array elements to the number found */              

  bind_dp2->N = bind_dp2->F;                                                    
                                                                              

  EXEC SQL OPEN C2 USING DESCRIPTOR bind_dp2;

  EXEC SQL DESCRIBE SELECT LIST FOR S2 INTO select_dp2;                                                                               

  return;

sqlerror:
  error ("build_cursor_two ");
}

/********************************************************************/

void prepare_select_one ( void )
{
  int i;

  EXEC SQL WHENEVER SQLERROR GOTO sqlerror;                                   
                                                                                
  select_dp->N = select_dp->F;                                                
  for ( i = 0 ; i < select_dp->N; i++ )
  {

      select_dp->V[i] = (char *)malloc(select_dp->L[i]);   }
  return;

sqlerror:

    error ("prepare_select_one");
}

/*********************************************************************/

void prepare_select_two ( void )
{
  int i;

  EXEC SQL WHENEVER SQLERROR GOTO sqlerror;                                   
                                                                                

  select_dp2->N = select_dp2->F;
  for ( i = 0 ; i < select_dp2->N; i++ )   {
    select_dp2->V[i] = (char *)malloc(select_dp2->L[i]);   }
  return;

sqlerror:

    error ("prepare_select_two");
}

/*********************************************************************/

void free_cursor_one ( void )
{
  int i;

  EXEC SQL WHENEVER SQLERROR GOTO sqlerror;                                   
                                                                                
  for (i = 0; i < select_dp-> F; i++)                                        
  {                                                                           
      free (select_dp->V[i]);                                                 
      free (select_dp->I[i]);                                                 
  }                                                                           

  sqlclu (bind_dp);                                                           
  sqlclu (select_dp);                                                         

  EXEC SQL CLOSE C;                                                           

  return;

sqlerror:

    error ("free_cursor_one");
}

/*********************************************************************/

void free_cursor_two ( void )
{
  int i;

  EXEC SQL WHENEVER SQLERROR GOTO sqlerror;                                   
                                                                                
  for (i = 0; i < select_dp2-> F; i++)                                        
  {                                                                           
      free (select_dp2->V[i]);
      free (select_dp2->I[i]);
  }
                                                                         

  sqlclu (bind_dp2);
  sqlclu (select_dp2);                                                                               

  EXEC SQL CLOSE C2;
  return;

sqlerror:

    error ("free_cursor_two");
}

/*********************************************************************/

void query_one ( void )
{
  int i;

#ifdef HEADERS

    for ( i = 0 ; i < select_dp->N; i++ )     printf("%-*.*s ",(int)select_dp->L[i],(int)select_dp->L[i],select_dp->S[i]);     printf ("\n\n");
#endif
                                                                                

    EXEC SQL WHENEVER SQLERROR GOTO sqlerror;                                   
                                                                                
    EXEC SQL WHENEVER NOT FOUND GOTO end_main;                                  

    for ( ; ; )                                                                 
    {                                                                           
        EXEC SQL FETCH C USING DESCRIPTOR select_dp;                            
                                                                                
        for ( i = 0 ; i < select_dp->N; i++ )
        {
          if ( select_dp->L[i] > 20 )
          {
            select_dp->V[i][20]= (char)NULL;
          }
          else
          {
            select_dp->V[i][select_dp->L[i]] = (char)NULL;
          }
          printf("%s ",select_dp->V[i]);                        
        }
        printf ("\n");                                                          
    }                                                                           
                                                                                
    end_main:                                                                   
        printf ("\n\n# of rows processed = %d\n", sqlca.sqlerrd[2]);

    return;

sqlerror:

    error ("query_one");
}

/*****************************************************************************/

void query_two ( void )
{
  int i;

#ifdef HEADERS

    for ( i = 0 ; i < select_dp2->N; i++ )

      printf("%-*.*s ",(int)select_dp2->L[i],(int)select_dp2->L[i],
                      select_dp2->S[i]);
    printf ("\n\n");                                                            

#endif
EXEC SQL WHENEVER SQLERROR GOTO sqlerror; EXEC SQL WHENEVER NOT FOUND GOTO end_main; for ( ; ; ) { EXEC SQL FETCH C2 USING DESCRIPTOR select_dp2; for ( i = 0 ; i < select_dp2->N; i++ ) { if ( select_dp2->L[i] > 20 ) { select_dp2->V[i][20]= (char)NULL; } else { select_dp2->V[i][select_dp2->L[i]] = (char)NULL; } printf("%s ",select_dp2->V[i]); } printf ("\n"); } end_main: printf ("\n\n# of rows processed = %d\n", sqlca.sqlerrd[2]);

    return;

sqlerror:

    error ("query_two");
} Received on Sat Oct 15 1994 - 08:09:55 CET

Original text of this message