문제

플랫폼 : Oracle 10G를 실행하는 Windows

Oracle Pro*C/C ++ 9.0.1.1.1로 일부 오래된 DLL 라이브러리 코드를 수정하고 사전 컴파일해야합니다. 이제 찾을 수 없을 때마다 더 이상 작동하지 않을 때마다 코드를 발견했습니다. 나는 사전 컴파일 전후에 보여주는 몇 가지 코드와 로그를 준비했습니다. 도울 수있는 사람에게 미리 감사드립니다.

(A) the PC program 

/************************************************************************/ 
/* fmt_clnt.pc                                                          */ 
/************************************************************************/ 
#include <stdlib.h> 
#include <string.h> 
#include <process.h> 
#include <stdio.h> 
#include <windows.h> 
/*--------------------------------------------------------------------------+ 
 | Copyright (c) Oracle Corporation 1993.  All Rights Reserved, Worldwide.  | 
 |                                                                          | 
 | NAME                                                                     | 
 |   ue.h - User Exit Functions Header File.                                | 
 |                                                                          | 
 | FUNCTION                                                                 | 
 |    Define the exitr structure. Misc defines.                             | 
 |                                                                          | 
 | CONTENTS                                                                 | 
 |                                                                          | 
 | NOTES                                                                    | 
 |                                                                          | 
 | MODIFIED                                                                 | 
 |  KMajkut  03/23/93 Created. Split off from old ue.h                      | 
 |                    Added definition of exitr from usrxit.h               | 
 +-------------------------------------------------------------------------*/ 

#ifndef UE 
#define UE 

#define MAX_ERRBUF_SIZE    256 

extern char  SRWERB[]; 

struct  exitr                           /* Struct definition for exits */ 
{ 
         char     *exnam;               /* Name of the user exit */ 
         int       (*exfp)(/*_ char* _*/);   /* Pointer to exit routine */ 
         int       extyp;               /* Type code for exit routine  */ 
#define  XITCC1    1                    /* C (for existing exits)      */ 
#define  XITCC     2                    /* C (call-by-reference)       */ 
#define  XITCOB    3                    /* Cobol                      */ 
#define  XITFOR    4                    /* Fortran                    */ 
#define  XITPLI    5                    /* PL/I                             */ 
#define  XITPAS    6                    /* Pascal                           */ 
#define  XITAda    7                    /* Ada                              */ 
}; 

/* Failure and Success return codes */ 
#define    FATAL_ERR  535    /* Use this on really bad errors */ 
#define    FAILURE  1403   /* Use this on recoverable error */ 
#define    SUCCESS  0      /* Use for success */ 

typedef struct exitr exitr; 

extern exitr iapxtb[]; 


#endif /* UE */ 

#define NORMAL      0 
#define HYFAILED      1 


# define externdef globaldef 


extern int fmt_clnt(); 
extern int inv_msp(); 
extern int inv_ism(); 
extern int readmsp(); 
extern int coll_bad(); 
/*******************************************************************/ 
exec sql begin declare section; 
char   frm_batch_str[10]; 
int    status; 
long   batch; 
long   todays_batch; 
int    loopcnt; 
char   sub_code[2]; 
char   description[61]; 

exec sql end declare section; 
/*******************************************************************/ 
/* exec sql INCLUDE sqlca; */ 

#ifndef    SQLCODE 
struct     sqlca 
{ 
           unsigned char  sqlcaid[8]; 
           long           sqlcabc; 
           long           sqlcode; 
           short          sqlerrml; 
           unsigned char  sqlerrmc[70]; 
           unsigned char  sqlerrp[8]; 
           long           sqlerrd[6]; 
           unsigned char  sqlwarn[11]; 
           unsigned char  sqlstate[5]; 
}; 
#define      SQLCODE   sqlca.sqlcode 
#define      SQLWARN0  sqlca.sqlwarn[0] 
#define      SQLWARN1  sqlca.sqlwarn[1] 
#define      SQLWARN2  sqlca.sqlwarn[2] 
#define      SQLWARN3  sqlca.sqlwarn[3] 
#define      SQLWARN4  sqlca.sqlwarn[4] 
#define      SQLWARN5  sqlca.sqlwarn[5] 
#define      SQLWARN6  sqlca.sqlwarn[6] 
#define      SQLWARN7  sqlca.sqlwarn[7] 
#define      SQLWARN8  sqlca.sqlwarn[8] 
#define      SQLWARN9  sqlca.sqlwarn[9] 
#define      SQLWARNA  sqlca.sqlwarn[10] 
#define      SQLSTATE  sqlca.sqlstate 
#endif 
struct sqlca sqlca; 

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

FILE   *logfp; 
int    sql_err(); 
int    call_sqlca_flags (); 
/*******************************************************************/ 
/*******************************************************************/ 
/*                         Main program                            */ 
/*******************************************************************/ 
/*******************************************************************/ 
int fmt_clnt() 
{         
   int i = 1; 
   int status = 0; 
   logfp = fopen("format.txt", "w"); 
   fprintf(logfp, "fmt_clnt version is HY2009Q4\n"); 
   strcpy(frm_batch_str, " "); 
   /****************************************************/ 
   /* get batch number from Forms program              */ 
   /****************************************************/ 
   /* exec iaf get reqdata.batch into :frm_batch_str;  */ 
   exec tools get reqdata.batch into :frm_batch_str;  
   /*****************************************************/ 
   /* Make sure dbms is accessible                      */ 
   /*****************************************************/ 
   exec sql whenever sqlerror do sql_err("Debug 1\n");  
   exec sql select max(batch) into :todays_batch from bill_test; 
   fprintf(logfp, "High batch is %d\n", todays_batch); 
/*******************************************************************/ 
/*******************************************************************/ 
/*                         For Loop Debug                          */ 
/*******************************************************************/ 
/*******************************************************************/ 
   fprintf(logfp, "Only 8 entries in table but will loop forever\n"); 
   fprintf(logfp, "For (;;) loop change to max 20 to force breaking out\n"); 
   exec sql declare c1 cursor for 
       select sub_code, description from submission_code where 1=1 order by sub_code; 
   exec sql OPEN c1; 
   exec sql whenever not found do break; 
   for (i; i < 20 ; ++ i) 
      { 
      exec sql fetch c1 into :sub_code, :description; 
      fprintf(logfp, "When i=%d sqlcode=%d sub_code=%s desc=%s\n", i,sqlca.sqlcode,sub_code,description);  
      } 
   exec sql CLOSE c1; 
/*******************************************************************/ 
/*******************************************************************/ 
/*******************************************************************/ 
/*                       End For Loop Debug                        */ 
/*******************************************************************/ 
/*******************************************************************/ 
   if (status == HYFAILED || status == IAPFAIL)  
      return (IAPFAIL); 
   fclose(logfp); 
   return (IAPSUCC); 
} 
/*******************************************************************/ 
/*******************************************************************/ 
/*                       SQL_ERR trapping                          */ 
/*******************************************************************/ 
/*******************************************************************/ 
int sql_err(msg) 
char *msg; 
{ 
char err_msg[128]; 
int  msg_len;     
/*hy   strcpy (err_msg, sqlca.sqlerrm.sqlerrmc);  */ 
   msg_len = strlen (err_msg); 
   fprintf(logfp, "error %s\n", err_msg); 
   exec sql ROLLBACK; 
   return (IAPFAIL); 
} 
/*******************************************************************/ 
/*******************************************************************/ 



(B) the C program after the precompile 

/* Result Sets Interface */ 
#ifndef SQL_CRSR 
#  define SQL_CRSR 
  struct sql_cursor 
  { 
    unsigned int curocn; 
    void *ptr1; 
    void *ptr2; 
    unsigned long magic; 
  }; 
  typedef struct sql_cursor sql_cursor; 
  typedef struct sql_cursor SQL_CURSOR; 
#endif /* SQL_CRSR */ 

/* Thread Safety */ 
typedef void * sql_context; 
typedef void * SQL_CONTEXT; 

/* Object support */ 
struct sqltvn 
{ 
  unsigned char *tvnvsn; 
  unsigned short tvnvsnl; 
  unsigned char *tvnnm; 
  unsigned short tvnnml; 
  unsigned char *tvnsnm; 
  unsigned short tvnsnml; 
}; 
typedef struct sqltvn sqltvn; 

struct sqladts 
{ 
  unsigned int adtvsn; 
  unsigned short adtmode; 
  unsigned short adtnum;  
  sqltvn adttvn[1];       
}; 
typedef struct sqladts sqladts; 

static struct sqladts sqladt = { 
  1,1,0, 
}; 

/* Binding to PL/SQL Records */ 
struct sqltdss 
{ 
  unsigned int tdsvsn; 
  unsigned short tdsnum; 
  unsigned char *tdsval[1]; 
}; 
typedef struct sqltdss sqltdss; 
static struct sqltdss sqltds = 
{ 
  1, 
  0, 
}; 


static char sqh000[] = "REQDATA.BATCH"; 
/* File name & Package Name */ 
struct sqlcxp 
{ 
  unsigned short fillen; 
           char  filnam[22]; 
}; 
static const struct sqlcxp sqlfpn = 
{ 
    21, 
    "C:\\puzzle\\FMT_CLNT.PC" 
}; 


static unsigned long sqlctx = 146507995; 


static struct sqlexd { 
   unsigned int   sqlvsn; 
   unsigned int   arrsiz; 
   unsigned int   iters; 
   unsigned int   offset; 
   unsigned short selerr; 
   unsigned short sqlety; 
   unsigned int   occurs; 
      const short *cud; 
   unsigned char  *sqlest; 
      const char  *stmt; 
   sqladts *sqladtp; 
   sqltdss *sqltdsp; 
            void  **sqphsv; 
   unsigned int   *sqphsl; 
            int   *sqphss; 
            void  **sqpind; 
            int   *sqpins; 
   unsigned int   *sqparm; 
   unsigned int   **sqparc; 
   unsigned short  *sqpadto; 
   unsigned short  *sqptdso; 
            void  *sqhstv[2]; 
   unsigned int   sqhstl[2]; 
            int   sqhsts[2]; 
            void  *sqindv[2]; 
            int   sqinds[2]; 
   unsigned int   sqharm[2]; 
   unsigned int   *sqharc[2]; 
   unsigned short  sqadto[2]; 
   unsigned short  sqtdso[2]; 
} sqlstm = {10,2}; 

/* SQLLIB Prototypes */ 
extern void sqlcxt (void **, unsigned long *, 
                    struct sqlexd *, const struct sqlcxp *); 
extern void sqlcx2t(void **, unsigned long *, 
                    struct sqlexd *, const struct sqlcxp *); 
extern void sqlbuft(void **, char *); 
extern void sqlgs2t(void **, char *); 
extern void sqlorat(void **, unsigned long *, void *); 

/* Forms Interface */ 
static const int IAPSUCC = 0; 
static const int IAPFAIL = 1403; 
static const int IAPFTL  = 535; 
extern void sqliem(char *, int *); 

 static const char *sq0003 = 
"select sub_code ,description  from submission_code where 1=1 order by sub_co\ 
de            "; 

typedef struct { unsigned short len; unsigned char arr[1]; } VARCHAR; 
typedef struct { unsigned short len; unsigned char arr[1]; } varchar; 

/* cud (compilation unit data) array */ 
static const short sqlcud0[] = 
{10,4130,178,0,0, 
5,0,0,1,0,0,51,152,0,0,2,1,0,1,0,1,1,0,0,2,97,0,0, 
28,0,0,2,43,0,4,157,0,0,1,0,0,1,0,2,3,0,0, 
47,0,0,3,90,0,9,168,0,0,0,0,0,1,0, 
62,0,0,3,0,0,13,172,0,0,2,0,0,1,0,2,97,0,0,2,97,0,0, 
85,0,0,3,0,0,15,175,0,0,0,0,0,1,0, 
100,0,0,4,0,0,31,200,0,0,0,0,0,1,0, 
}; 


/************************************************************************/ 
/* fmt_clnt.pc                                                          */ 
/************************************************************************/ 
#include <stdlib.h> 
#include <string.h> 
#include <process.h> 
#include <stdio.h> 
#include <windows.h> 
/*--------------------------------------------------------------------------+ 
 | Copyright (c) Oracle Corporation 1993.  All Rights Reserved, Worldwide.  | 
 |                                                                          | 
 | NAME                                                                     | 
 |   ue.h - User Exit Functions Header File.                                | 
 |                                                                          | 
 | FUNCTION                                                                 | 
 |    Define the exitr structure. Misc defines.                             | 
 |                                                                          | 
 | CONTENTS                                                                 | 
 |                                                                          | 
 | NOTES                                                                    | 
 |                                                                          | 
 | MODIFIED                                                                 | 
 |  KMajkut  03/23/93 Created. Split off from old ue.h                      | 
 |                    Added definition of exitr from usrxit.h               | 
 +-------------------------------------------------------------------------*/ 

#ifndef UE 
#define UE 

#define MAX_ERRBUF_SIZE    256 

extern char  SRWERB[]; 

struct  exitr                           /* Struct definition for exits */ 
{ 
         char     *exnam;               /* Name of the user exit */ 
         int       (*exfp)(/*_ char* _*/);   /* Pointer to exit routine */ 
         int       extyp;               /* Type code for exit routine  */ 
#define  XITCC1    1                    /* C (for existing exits)      */ 
#define  XITCC     2                    /* C (call-by-reference)       */ 
#define  XITCOB    3                    /* Cobol                      */ 
#define  XITFOR    4                    /* Fortran                    */ 
#define  XITPLI    5                    /* PL/I                             */ 
#define  XITPAS    6                    /* Pascal                           */ 
#define  XITAda    7                    /* Ada                              */ 
}; 

/* Failure and Success return codes */ 
#define    FATAL_ERR  535    /* Use this on really bad errors */ 
#define    FAILURE  1403   /* Use this on recoverable error */ 
#define    SUCCESS  0      /* Use for success */ 

typedef struct exitr exitr; 

extern exitr iapxtb[]; 


#endif /* UE */ 

#define NORMAL      0 
#define HYFAILED      1 


# define externdef globaldef 


extern int fmt_clnt(); 
extern int inv_msp(); 
extern int inv_ism(); 
extern int readmsp(); 
extern int coll_bad(); 
/*******************************************************************/ 
/* exec sql begin declare section; */ 

char   frm_batch_str[10]; 
int    status; 
long   batch; 
long   todays_batch; 
int    loopcnt; 
char   sub_code[2]; 
char   description[61]; 

/* exec sql end declare section; */ 

/*******************************************************************/ 
/* exec sql INCLUDE sqlca; */ 

#ifndef    SQLCODE 
struct     sqlca 
{ 
           unsigned char  sqlcaid[8]; 
           long           sqlcabc; 
           long           sqlcode; 
           short          sqlerrml; 
           unsigned char  sqlerrmc[70]; 
           unsigned char  sqlerrp[8]; 
           long           sqlerrd[6]; 
           unsigned char  sqlwarn[11]; 
           unsigned char  sqlstate[5]; 
}; 
#define      SQLCODE   sqlca.sqlcode 
#define      SQLWARN0  sqlca.sqlwarn[0] 
#define      SQLWARN1  sqlca.sqlwarn[1] 
#define      SQLWARN2  sqlca.sqlwarn[2] 
#define      SQLWARN3  sqlca.sqlwarn[3] 
#define      SQLWARN4  sqlca.sqlwarn[4] 
#define      SQLWARN5  sqlca.sqlwarn[5] 
#define      SQLWARN6  sqlca.sqlwarn[6] 
#define      SQLWARN7  sqlca.sqlwarn[7] 
#define      SQLWARN8  sqlca.sqlwarn[8] 
#define      SQLWARN9  sqlca.sqlwarn[9] 
#define      SQLWARNA  sqlca.sqlwarn[10] 
#define      SQLSTATE  sqlca.sqlstate 
#endif 
struct sqlca sqlca; 

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

FILE   *logfp; 
int    sql_err(); 
int    call_sqlca_flags (); 
/*******************************************************************/ 
/*******************************************************************/ 
/*                         Main program                            */ 
/*******************************************************************/ 
/*******************************************************************/ 
int fmt_clnt() 
{         
   int i = 1; 
   int status = 0; 
   logfp = fopen("format.txt", "w"); 
   fprintf(logfp, "fmt_clnt version is HY2009Q4\n"); 
   strcpy(frm_batch_str, " "); 
   /****************************************************/ 
   /* get batch number from Forms program              */ 
   /****************************************************/ 
   /* exec iaf get reqdata.batch into :frm_batch_str;  */ 
   /* exec tools get reqdata.batch into :frm_batch_str; */ 

{ 
   struct sqlexd sqlstm; 
   sqlstm.sqlvsn = 10; 
   sqlstm.arrsiz = 2; 
   sqlstm.sqladtp = &sqladt; 
   sqlstm.sqltdsp = &sqltds; 
   sqlstm.stmt = ""; 
   sqlstm.iters = (unsigned int  )1; 
   sqlstm.offset = (unsigned int  )5; 
   sqlstm.cud = sqlcud0; 
   sqlstm.sqlest = (unsigned char  *)&sqlca; 
   sqlstm.sqlety = (unsigned short)256; 
   sqlstm.occurs = (unsigned int  )0; 
   sqlstm.sqhstv[0] = (         void  *)sqh000; 
   sqlstm.sqhstl[0] = (unsigned int  )13; 
   sqlstm.sqhsts[0] = (         int  )0; 
   sqlstm.sqindv[0] = (         void  *)0; 
   sqlstm.sqinds[0] = (         int  )0; 
   sqlstm.sqharm[0] = (unsigned int  )0; 
   sqlstm.sqadto[0] = (unsigned short )0; 
   sqlstm.sqtdso[0] = (unsigned short )0; 
   sqlstm.sqhstv[1] = (         void  *)frm_batch_str; 
   sqlstm.sqhstl[1] = (unsigned int  )10; 
   sqlstm.sqhsts[1] = (         int  )0; 
   sqlstm.sqindv[1] = (         void  *)0; 
   sqlstm.sqinds[1] = (         int  )0; 
   sqlstm.sqharm[1] = (unsigned int  )0; 
   sqlstm.sqadto[1] = (unsigned short )0; 
   sqlstm.sqtdso[1] = (unsigned short )0; 
   sqlstm.sqphsv = sqlstm.sqhstv; 
   sqlstm.sqphsl = sqlstm.sqhstl; 
   sqlstm.sqphss = sqlstm.sqhsts; 
   sqlstm.sqpind = sqlstm.sqindv; 
   sqlstm.sqpins = sqlstm.sqinds; 
   sqlstm.sqparm = sqlstm.sqharm; 
   sqlstm.sqparc = sqlstm.sqharc; 
   sqlstm.sqpadto = sqlstm.sqadto; 
   sqlstm.sqptdso = sqlstm.sqtdso; 
   sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
} 


   /*****************************************************/ 
   /* Make sure dbms is accessible                      */ 
   /*****************************************************/ 
   /* exec sql whenever sqlerror do sql_err("Debug 1\n"); */ 

   /* exec sql select max(batch) into :todays_batch from bill_test; */ 

{ 
   struct sqlexd sqlstm; 
   sqlstm.sqlvsn = 10; 
   sqlstm.arrsiz = 2; 
   sqlstm.sqladtp = &sqladt; 
   sqlstm.sqltdsp = &sqltds; 
   sqlstm.stmt = "select max(batch) into :b0  from bill_test "; 
   sqlstm.iters = (unsigned int  )1; 
   sqlstm.offset = (unsigned int  )28; 
   sqlstm.selerr = (unsigned short)1; 
   sqlstm.cud = sqlcud0; 
   sqlstm.sqlest = (unsigned char  *)&sqlca; 
   sqlstm.sqlety = (unsigned short)256; 
   sqlstm.occurs = (unsigned int  )0; 
   sqlstm.sqhstv[0] = (         void  *)&todays_batch; 
   sqlstm.sqhstl[0] = (unsigned int  )sizeof(long); 
   sqlstm.sqhsts[0] = (         int  )0; 
   sqlstm.sqindv[0] = (         void  *)0; 
   sqlstm.sqinds[0] = (         int  )0; 
   sqlstm.sqharm[0] = (unsigned int  )0; 
   sqlstm.sqadto[0] = (unsigned short )0; 
   sqlstm.sqtdso[0] = (unsigned short )0; 
   sqlstm.sqphsv = sqlstm.sqhstv; 
   sqlstm.sqphsl = sqlstm.sqhstl; 
   sqlstm.sqphss = sqlstm.sqhsts; 
   sqlstm.sqpind = sqlstm.sqindv; 
   sqlstm.sqpins = sqlstm.sqinds; 
   sqlstm.sqparm = sqlstm.sqharm; 
   sqlstm.sqparc = sqlstm.sqharc; 
   sqlstm.sqpadto = sqlstm.sqadto; 
   sqlstm.sqptdso = sqlstm.sqtdso; 
   sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
   if (sqlca.sqlcode < 0) sql_err("Debug 1\n"); 
} 


   fprintf(logfp, "High batch is %d\n", todays_batch); 
/*******************************************************************/ 
/*******************************************************************/ 
/*                         For Loop Debug                          */ 
/*******************************************************************/ 
/*******************************************************************/ 
   fprintf(logfp, "Only 8 entries in table but will loop forever\n"); 
   fprintf(logfp, "For (;;) loop change to max 20 to force breaking out\n"); 
   /* exec sql declare c1 cursor for 
       select sub_code, description from submission_code where 1=1 order by sub_code; */ 

   /* exec sql OPEN c1; */ 

{ 
   struct sqlexd sqlstm; 
   sqlstm.sqlvsn = 10; 
   sqlstm.arrsiz = 2; 
   sqlstm.sqladtp = &sqladt; 
   sqlstm.sqltdsp = &sqltds; 
   sqlstm.stmt = sq0003; 
   sqlstm.iters = (unsigned int  )1; 
   sqlstm.offset = (unsigned int  )47; 
   sqlstm.selerr = (unsigned short)1; 
   sqlstm.cud = sqlcud0; 
   sqlstm.sqlest = (unsigned char  *)&sqlca; 
   sqlstm.sqlety = (unsigned short)256; 
   sqlstm.occurs = (unsigned int  )0; 
   sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
   if (sqlca.sqlcode < 0) sql_err("Debug 1\n"); 
} 


   /* exec sql whenever not found do break; */ 

   for (i; i < 20 ; ++ i) 
      { 
      /* exec sql fetch c1 into :sub_code, :description; */ 

{ 
      struct sqlexd sqlstm; 
      sqlstm.sqlvsn = 10; 
      sqlstm.arrsiz = 2; 
      sqlstm.sqladtp = &sqladt; 
      sqlstm.sqltdsp = &sqltds; 
      sqlstm.iters = (unsigned int  )1; 
      sqlstm.offset = (unsigned int  )62; 
      sqlstm.selerr = (unsigned short)1; 
      sqlstm.cud = sqlcud0; 
      sqlstm.sqlest = (unsigned char  *)&sqlca; 
      sqlstm.sqlety = (unsigned short)256; 
      sqlstm.occurs = (unsigned int  )0; 
      sqlstm.sqhstv[0] = (         void  *)sub_code; 
      sqlstm.sqhstl[0] = (unsigned int  )2; 
      sqlstm.sqhsts[0] = (         int  )0; 
      sqlstm.sqindv[0] = (         void  *)0; 
      sqlstm.sqinds[0] = (         int  )0; 
      sqlstm.sqharm[0] = (unsigned int  )0; 
      sqlstm.sqadto[0] = (unsigned short )0; 
      sqlstm.sqtdso[0] = (unsigned short )0; 
      sqlstm.sqhstv[1] = (         void  *)description; 
      sqlstm.sqhstl[1] = (unsigned int  )61; 
      sqlstm.sqhsts[1] = (         int  )0; 
      sqlstm.sqindv[1] = (         void  *)0; 
      sqlstm.sqinds[1] = (         int  )0; 
      sqlstm.sqharm[1] = (unsigned int  )0; 
      sqlstm.sqadto[1] = (unsigned short )0; 
      sqlstm.sqtdso[1] = (unsigned short )0; 
      sqlstm.sqphsv = sqlstm.sqhstv; 
      sqlstm.sqphsl = sqlstm.sqhstl; 
      sqlstm.sqphss = sqlstm.sqhsts; 
      sqlstm.sqpind = sqlstm.sqindv; 
      sqlstm.sqpins = sqlstm.sqinds; 
      sqlstm.sqparm = sqlstm.sqharm; 
      sqlstm.sqparc = sqlstm.sqharc; 
      sqlstm.sqpadto = sqlstm.sqadto; 
      sqlstm.sqptdso = sqlstm.sqtdso; 
      sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
      if (sqlca.sqlcode == 1403) break; 
      if (sqlca.sqlcode < 0) sql_err("Debug 1\n"); 
} 


      fprintf(logfp, "When i=%d sqlcode=%d sub_code=%s desc=%s\n", i,sqlca.sqlcode,sub_code,description);  
      } 
   /* exec sql CLOSE c1; */ 

{ 
   struct sqlexd sqlstm; 
   sqlstm.sqlvsn = 10; 
   sqlstm.arrsiz = 2; 
   sqlstm.sqladtp = &sqladt; 
   sqlstm.sqltdsp = &sqltds; 
   sqlstm.iters = (unsigned int  )1; 
   sqlstm.offset = (unsigned int  )85; 
   sqlstm.cud = sqlcud0; 
   sqlstm.sqlest = (unsigned char  *)&sqlca; 
   sqlstm.sqlety = (unsigned short)256; 
   sqlstm.occurs = (unsigned int  )0; 
   sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
   if (sqlca.sqlcode < 0) sql_err("Debug 1\n"); 
} 


/*******************************************************************/ 
/*******************************************************************/ 
/*******************************************************************/ 
/*                       End For Loop Debug                        */ 
/*******************************************************************/ 
/*******************************************************************/ 
   if (status == HYFAILED || status == IAPFAIL)  
      return (IAPFAIL); 
   fclose(logfp); 
   return (IAPSUCC); 
} 
/*******************************************************************/ 
/*******************************************************************/ 
/*                       SQL_ERR trapping                          */ 
/*******************************************************************/ 
/*******************************************************************/ 
int sql_err(msg) 
char *msg; 
{ 
char err_msg[128]; 
int  msg_len;     
/*hy   strcpy (err_msg, sqlca.sqlerrm.sqlerrmc);  */ 
   msg_len = strlen (err_msg); 
   fprintf(logfp, "error %s\n", err_msg); 
   /* exec sql ROLLBACK; */ 

{ 
   struct sqlexd sqlstm; 
   sqlstm.sqlvsn = 10; 
   sqlstm.arrsiz = 2; 
   sqlstm.sqladtp = &sqladt; 
   sqlstm.sqltdsp = &sqltds; 
   sqlstm.iters = (unsigned int  )1; 
   sqlstm.offset = (unsigned int  )100; 
   sqlstm.cud = sqlcud0; 
   sqlstm.sqlest = (unsigned char  *)&sqlca; 
   sqlstm.sqlety = (unsigned short)256; 
   sqlstm.occurs = (unsigned int  )0; 
   sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
   if (sqlca.sqlcode < 0) sql_err("Debug 1\n"); 
} 


   return (IAPFAIL); 
} 
/*******************************************************************/ 
/*******************************************************************/ 

fmt_clnt version is HY2009Q4 
High batch is 20091224 
Only 8 entries in table but will loop forever 
For (;;) loop change to max 20 to force breaking out 
When i=1 sqlcode=0 sub_code=0 desc=Normal submission                                           
When i=2 sqlcode=0 sub_code=A desc=Requested pre-approval claim                                
When i=3 sqlcode=0 sub_code=C desc=Subscriber coverage problem                                 
When i=4 sqlcode=0 sub_code=D desc=Duplicate claim                                             
When i=5 sqlcode=0 sub_code=I desc=ICBC claim                                                  
When i=6 sqlcode=0 sub_code=R desc=Re-submitted claim                   
도움이 되었습니까?

해결책

나는 Zero Pro*C를 알고 있지만 가장 일반적으로 인정되는 구문은 이것이라고 생각합니다.

EXEC SQL WHENEVER NOT FOUND DO break;
for(;;)
  //statement
EXEC SQL WHENEVER NOT FOUND CONTINUE;

또한 확인할 때 찾을 수 없습니다 값은 일반적으로 1403이 아닌 SQLCode 100에 대해 확인합니다. 차이가 무엇인지 잘 모르겠지만 두 가지를 모두 보았습니다.

다른 팁

원래 FMT_CLNT.pc 파일에는 다음과 같은 코드 덩어리가 있습니다.

/* exec sql INCLUDE sqlca; */ 

이 코드는 제거하고 대체해야합니다.

#include <sqlca.h>

파일에있는 코드는 이전 버전 주위에 구축되었으며 구조가 미묘한 변화를 가질 수 있습니다. 이것은 하나의 주요 버전에서 다른 주요 버전 또는 Oracle로 갈 때 특히 그렇습니다.

여전히 관심이있는 사람들을 위해 : 나는 깨끗한 PC를 구축 한 다음 이전 버전의 프리 컴파일러를 설치함으로써 문제를 해결했습니다. 두 출력을 비교하면 SQLCA.SQLCode의 데이터 유형이 문제를 일으키는 것 같습니다. 찬성C ver 2.2 sqlcode는 Pro입니다C ver 9.0은 정수입니다. 이것은 내가 왜 항상 0을 반환했는지 설명 할 것입니다. 기여한 모든 분들께 감사드립니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top