AIX系统下proc*数据采集

分享一篇关于AIX系统下采用proc*实现oracle数据采集的例子,采用的技术主要有shell脚本、C++、proc*以及makefile

首先呢看看c++头文件test.h,要注意的是头文件需要引入类库stdlib.h和sqlca.h

#include <stdio.h>
#include <stdlib.h>
#include <sqlca.h>
#include <string.h>
#include <stdarg.h>
#include <strings.h>
#include <time.h> 



/*系统参数*/
#define DEFAULT_PRINT_NUM 		10000          		/*默认打印行数*/
#define DEFAULT_INTERVAL_NUM 	10000          		/*默认每个输出文件纪录条数*/ 
#define DEFAULT_BUF_SIZE 		2000           		/*默认缓存纪录数*/
#define DEFAULT_OUTPUT_LENGTH 	3000           		/*默认每条纪录长度--------对速度影响较大*/
#define DEFAULT_INI_FILE 		"param.conf"   		/*默认配置文件*/
#define DEFAULT_LOG_FILE 		"DATATOFILE.log"   	/*默认日志文件*/
#define DEFAULT_FILE_NUM        1000           		/*默认产生文件数*/

#define DEFAULT_FILEBUFFER_LEN  1024*1024      		/*写文件缓冲大小*/
#define MAXLINES 10000 

FILE* p_fp,* in_fp;
char c_tmp[200];
char c_str[25];
char buf[MAXLINES][25]; 
char* ps[3];
int k = 0,n = 0;
char* p;


/*方法声明*/
void getconf();
void initparam();
void rearparam();
void GetValue(char* c_str, char* c_value, char* c_valuename);
void PrintParam();
int ConnectDB(char * u_username);
void DisconnectDB();
void Query();
void setparam(int argc, char* argv[]);
void PRINTF(char msg[]);
int GetDateTime(char *sDateTime);
int c = 0;

/*参数构成体*/
struct Param
{
	char username[200];
	char userpass[200];
	char database[200];
	char USER_PASSWORD[200];
	char FILENAME[200];
	char c_SqlStr[3000];
	char POSTFIX[200];
}param;

char* pd[] =
{
	"[USER_NAME]", "[USER_PASSWD]", "[DATABASE]", "[USER_PASSWORD],[FILENAME],[SQL]"
};


/***************参数初始化***********************/
 void initparam()
 {
 	memset( param.username, 0, sizeof( param.username) ) ;
 	memset( param.userpass, 0, sizeof( param.userpass) ) ;
 	memset( param.database, 0, sizeof( param.database) ) ;
 	memset( param.FILENAME, 0, sizeof( param.FILENAME) ) ;
 	
	}
/***************参数处理*************************/
void setparam(int argc, char* argv[])
{
	
	char c_str[50000];
	if ((p_fp = fopen(argv[2], "r")) == NULL)
		printf("打开配置文件%s失败!\n", argv[2]);
	else
	{
		if (strcmp(argv[1], "-f") == 0)
		{
			/*while (1)
					{
						if (fgets(c_str, 25, p_fp) == NULL)
							break; 
						strcpy(buf[n], c_str); 
						p = strstr(buf[n], ":"); 
						my_Map.insert(make_pair<string, char*>(pd[k], p)); 
						k++; 
						n++; 
						if (n >= MAXLINES)
						{
							printf(">%d lines ignored.\n", MAXLINES); 
							break;
						}
					}*/
		}
		else if (strcmp(argv[1], "-d") == 0)   //输入参数不同
		{
			while (1)
			{
				if (fgets(c_str, sizeof(c_str), p_fp) == NULL)
					break;
				if (c_str[0] != '[' || strstr(c_str, ":") == NULL)
					continue;	 
				if (strstr(c_str, "[USER_NAME]") != NULL)
				{
					GetValue(c_str, param.username, "[USER_NAME]");
					continue;
				}

				/**DB**/

				if (strstr(c_str, "[USER_PASSWD]") != NULL)
				{
					GetValue(c_str, param.userpass, "[USER_PASSWD]");
					continue;
				}

				if (strstr(c_str, "[DATABASE]") != NULL)
				{
					GetValue(c_str, param.database, "[DATABASE]") ;
					continue;
				}
				if (strstr(c_str, "[USER_PASSWORD]") != NULL)
				{
					GetValue(c_str, param.USER_PASSWORD, "[USER_PASSWORD]") ;
					continue;
				}
				if (strstr(c_str, "[FILENAME]") != NULL)
				{
					GetValue(c_str, param.FILENAME, "[FILENAME]") ;
					continue;
				}
				if (strstr(c_str, "[SQL]") != NULL)
				{
					GetValue(c_str, param.c_SqlStr, "[SQL]") ;
					continue;
				}
				if (strstr(c_str, "[POSTFIX]") != NULL)
				{
					GetValue(c_str, param.POSTFIX, "[POSTFIX]") ;
					continue;
				}
			}
		}
	}
}
/**********************输出配置信息**************************/
void PrintParam()
{
	printf("**********************************参数信息如下:**********************************\n");
	printf("[SYS]\n"); 
	printf("[USER_NAME]:%s\n", param.username);
	printf("[USER_PASSWD]:%s\n", param.userpass); 
	printf("[DATABASE]:%s\n", param.database);
	printf("[USER_PASS_BASE]:%s\n", param.USER_PASSWORD);
	printf("[FILENAME]:%s\n", param.FILENAME);
	printf("[POSTFIX]:%s\n", param.POSTFIX);
	/*printf("[SQL]:%s\n", param.c_SqlStr);*/
	printf("*********************************************************************************\n");
}

/**********************读取配置文件**************************/
void GetValue(char* c_str, char* c_value, char* c_valuename)
{
	char* s = NULL;

	if ((s = strchr(c_str, ':')) == NULL)
	{
		printf("读取参数%s失败!\n", c_valuename);
		exit(-1);
	}

	strcpy(c_value, s + 1);
	if (c_value[strlen(c_value) - 1] == '\n')
		c_value[strlen(c_value) - 1] = '\0';
}
void PRINTF(char  msg[])
{
	
	printf("%s\n",msg);
}

int GetDateTime(char *sDateTime)
{
	char	achar_date_time[32];
	struct tm	* s_tm_time;
	time_t	timer;

	memset(achar_date_time,0,sizeof(achar_date_time));
	
	time(&timer);
	s_tm_time=(struct tm *)localtime(&timer);
	strftime(achar_date_time,sizeof(achar_date_time),"%Y-%m-%d %H:%M:%S",s_tm_time);
	
	strcpy(sDateTime,achar_date_time);
	
	return strlen(sDateTime);
}

然后是test.cpp文件,引入test.h头文件

/* Result Sets Interface */
#ifndef SQL_CRSR
#  define SQL_CRSR
  struct sql_cursor
  {
    unsigned int curocn;
    void *ptr1;
    void *ptr2;
    unsigned int 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,
};

/* File name & Package Name */
struct sqlcxp
{
  unsigned short fillen;
           char  filnam[8];
};
static const struct sqlcxp sqlfpn =
{
    7,
    "test.pc"
};


static unsigned int sqlctx = 9995;


static struct sqlexd {
   unsigned long  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;
   unsigned char  **sqphsv;
   unsigned long  *sqphsl;
            int   *sqphss;
            short **sqpind;
            int   *sqpins;
   unsigned long  *sqparm;
   unsigned long  **sqparc;
   unsigned short  *sqpadto;
   unsigned short  *sqptdso;
   unsigned int   sqlcmax;
   unsigned int   sqlcmin;
   unsigned int   sqlcincr;
   unsigned int   sqlctimeout;
   unsigned int   sqlcnowait;
            int   sqfoff;
   unsigned int   sqcmod;
   unsigned int   sqfmod;
   unsigned char  *sqhstv[4];
   unsigned long  sqhstl[4];
            int   sqhsts[4];
            short *sqindv[4];
            int   sqinds[4];
   unsigned long  sqharm[4];
   unsigned long  *sqharc[4];
   unsigned short  sqadto[4];
   unsigned short  sqtdso[4];
} sqlstm = {12,4};

// Prototypes
extern "C" {
  void sqlcxt (void **, unsigned int *,
               struct sqlexd *, const struct sqlcxp *);
  void sqlcx2t(void **, unsigned int *,
               struct sqlexd *, const struct sqlcxp *);
  void sqlbuft(void **, char *);
  void sqlgs2t(void **, char *);
  void sqlorat(void **, unsigned int *, void *);
}

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

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[] =
{12,4130,852,0,0,
5,0,0,1,0,0,283,21,0,0,4,4,0,1,0,1,9,0,0,1,10,0,0,1,10,0,0,1,10,0,0,
36,0,0,2,0,0,288,35,0,0,0,0,0,1,0,
51,0,0,3,51,0,260,60,0,0,1,0,0,1,0,2,9,0,0,
70,0,0,4,0,0,273,84,0,0,1,1,0,1,0,1,9,0,0,
89,0,0,4,0,0,301,90,0,0,0,0,0,1,0,
104,0,0,4,0,0,269,95,0,0,1,0,0,1,0,2,9,0,0,
123,0,0,4,0,0,271,112,0,0,0,0,0,1,0,
138,0,0,5,0,0,286,113,0,0,0,0,0,1,0,
};



#include "test.h"

int main(int argc, char* argv[])
{
	initparam();
	setparam(argc, argv);
	PrintParam();
	Query();
	return 0;
}
int ConnectDB(char* c_UserPasswd)
{
/* 	EXEC SQL INCLUDE SQLCA;
 */ 
/*
 * $Header: sqlca.h 24-apr-2003.12:50:58 mkandarp Exp $ sqlca.h 
 */

/* Copyright (c) 1985, 2003, Oracle Corporation.  All rights reserved.  */
 
/*
NAME
  SQLCA : SQL Communications Area.
FUNCTION
  Contains no code. Oracle fills in the SQLCA with status info
  during the execution of a SQL stmt.
NOTES
  **************************************************************
  ***                                                        ***
  *** This file is SOSD.  Porters must change the data types ***
  *** appropriately on their platform.  See notes/pcport.doc ***
  *** for more information.                                  ***
  ***                                                        ***
  **************************************************************

  If the symbol SQLCA_STORAGE_CLASS is defined, then the SQLCA
  will be defined to have this storage class. For example:
 
    #define SQLCA_STORAGE_CLASS extern
 
  will define the SQLCA as an extern.
 
  If the symbol SQLCA_INIT is defined, then the SQLCA will be
  statically initialized. Although this is not necessary in order
  to use the SQLCA, it is a good pgming practice not to have
  unitialized variables. However, some C compilers/OS's don't
  allow automatic variables to be init'd in this manner. Therefore,
  if you are INCLUDE'ing the SQLCA in a place where it would be
  an automatic AND your C compiler/OS doesn't allow this style
  of initialization, then SQLCA_INIT should be left undefined --
  all others can define SQLCA_INIT if they wish.

  If the symbol SQLCA_NONE is defined, then the SQLCA variable will
  not be defined at all.  The symbol SQLCA_NONE should not be defined
  in source modules that have embedded SQL.  However, source modules
  that have no embedded SQL, but need to manipulate a sqlca struct
  passed in as a parameter, can set the SQLCA_NONE symbol to avoid
  creation of an extraneous sqlca variable.
 
MODIFIED
    lvbcheng   07/31/98 -  long to int
    jbasu      12/12/94 -  Bug 217878: note this is an SOSD file
    losborne   08/11/92 -  No sqlca var if SQLCA_NONE macro set 
  Clare      12/06/84 - Ch SQLCA to not be an extern.
  Clare      10/21/85 - Add initialization.
  Bradbury   01/05/86 - Only initialize when SQLCA_INIT set
  Clare      06/12/86 - Add SQLCA_STORAGE_CLASS option.
*/
 
#ifndef SQLCA
#define SQLCA 1
 
struct   sqlca
         {
         /* ub1 */ char    sqlcaid[8];
         /* b4  */ int     sqlabc;
         /* b4  */ int     sqlcode;
         struct
           {
           /* ub2 */ unsigned short sqlerrml;
           /* ub1 */ char           sqlerrmc[70];
           } sqlerrm;
         /* ub1 */ char    sqlerrp[8];
         /* b4  */ int     sqlerrd[6];
         /* ub1 */ char    sqlwarn[8];
         /* ub1 */ char    sqlext[8];
         };

#ifndef SQLCA_NONE 
#ifdef   SQLCA_STORAGE_CLASS
SQLCA_STORAGE_CLASS struct sqlca sqlca
#else
         struct sqlca sqlca
#endif
 
#ifdef  SQLCA_INIT
         = {
         {'S', 'Q', 'L', 'C', 'A', ' ', ' ', ' '},
         sizeof(struct sqlca),
         0,
         { 0, {0}},
         {'N', 'O', 'T', ' ', 'S', 'E', 'T', ' '},
         {0, 0, 0, 0, 0, 0},
         {0, 0, 0, 0, 0, 0, 0, 0},
         {0, 0, 0, 0, 0, 0, 0, 0}
         }
#endif
         ;
#endif
 
#endif
 
/* end SQLCA */

	/* EXEC SQL BEGIN DECLARE SECTION; */ 

	/* VARCHAR UserPasswd[200]; */ 
struct { unsigned short len; unsigned char arr[200]; } UserPasswd;

	/* EXEC SQL END DECLARE SECTION; */ 

	strcpy((char*)UserPasswd.arr, c_UserPasswd);
	UserPasswd.len = strlen((char*)UserPasswd.arr);

	/* EXEC SQL connect : UserPasswd; */ 

{
 struct sqlexd sqlstm;
 sqlstm.sqlvsn = 12;
 sqlstm.arrsiz = 4;
 sqlstm.sqladtp = &sqladt;
 sqlstm.sqltdsp = &sqltds;
 sqlstm.iters = (unsigned int  )10;
 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] = (unsigned char  *)&UserPasswd;
 sqlstm.sqhstl[0] = (unsigned long )202;
 sqlstm.sqhsts[0] = (         int  )202;
 sqlstm.sqindv[0] = (         short *)0;
 sqlstm.sqinds[0] = (         int  )0;
 sqlstm.sqharm[0] = (unsigned long )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;
 sqlstm.sqlcmax = (unsigned int )100;
 sqlstm.sqlcmin = (unsigned int )2;
 sqlstm.sqlcincr = (unsigned int )1;
 sqlstm.sqlctimeout = (unsigned int )0;
 sqlstm.sqlcnowait = (unsigned int )0;
 sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}


	if (sqlca.sqlcode != 0)
	{
		printf("连接数据库失败,错误代码:%ld\n", sqlca.sqlcode);
	}
	else
	{
		printf("连接数据库成功:%ld\n", sqlca.sqlcode);
	}
	return sqlca.sqlcode;
}

void DisconnectDB()
{
	/* EXEC SQL ROLLBACK WORK RELEASE; */ 

{
 struct sqlexd sqlstm;
 sqlstm.sqlvsn = 12;
 sqlstm.arrsiz = 4;
 sqlstm.sqladtp = &sqladt;
 sqlstm.sqltdsp = &sqltds;
 sqlstm.iters = (unsigned int  )1;
 sqlstm.offset = (unsigned int  )36;
 sqlstm.cud = sqlcud0;
 sqlstm.sqlest = (unsigned char  *)&sqlca;
 sqlstm.sqlety = (unsigned short)256;
 sqlstm.occurs = (unsigned int  )0;
 sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}


}

void Query()
{
	char *datainfo;
	char c_DateTime[50];	/*输出的时间变量*/
	int i = 0;
	int j=0;
	GetDateTime(c_DateTime);
	char msg[DEFAULT_FILEBUFFER_LEN];
	char C_SP_TYPE_CODE[DEFAULT_FILEBUFFER_LEN];
/* 	EXEC SQL INCLUDE SQLCA;
 */ 
/*
 * $Header: sqlca.h 24-apr-2003.12:50:58 mkandarp Exp $ sqlca.h 
 */

/* Copyright (c) 1985, 2003, Oracle Corporation.  All rights reserved.  */
 
/*
NAME
  SQLCA : SQL Communications Area.
FUNCTION
  Contains no code. Oracle fills in the SQLCA with status info
  during the execution of a SQL stmt.
NOTES
  **************************************************************
  ***                                                        ***
  *** This file is SOSD.  Porters must change the data types ***
  *** appropriately on their platform.  See notes/pcport.doc ***
  *** for more information.                                  ***
  ***                                                        ***
  **************************************************************

  If the symbol SQLCA_STORAGE_CLASS is defined, then the SQLCA
  will be defined to have this storage class. For example:
 
    #define SQLCA_STORAGE_CLASS extern
 
  will define the SQLCA as an extern.
 
  If the symbol SQLCA_INIT is defined, then the SQLCA will be
  statically initialized. Although this is not necessary in order
  to use the SQLCA, it is a good pgming practice not to have
  unitialized variables. However, some C compilers/OS's don't
  allow automatic variables to be init'd in this manner. Therefore,
  if you are INCLUDE'ing the SQLCA in a place where it would be
  an automatic AND your C compiler/OS doesn't allow this style
  of initialization, then SQLCA_INIT should be left undefined --
  all others can define SQLCA_INIT if they wish.

  If the symbol SQLCA_NONE is defined, then the SQLCA variable will
  not be defined at all.  The symbol SQLCA_NONE should not be defined
  in source modules that have embedded SQL.  However, source modules
  that have no embedded SQL, but need to manipulate a sqlca struct
  passed in as a parameter, can set the SQLCA_NONE symbol to avoid
  creation of an extraneous sqlca variable.
 
MODIFIED
    lvbcheng   07/31/98 -  long to int
    jbasu      12/12/94 -  Bug 217878: note this is an SOSD file
    losborne   08/11/92 -  No sqlca var if SQLCA_NONE macro set 
  Clare      12/06/84 - Ch SQLCA to not be an extern.
  Clare      10/21/85 - Add initialization.
  Bradbury   01/05/86 - Only initialize when SQLCA_INIT set
  Clare      06/12/86 - Add SQLCA_STORAGE_CLASS option.
*/
 
#ifndef SQLCA
#define SQLCA 1
 
struct   sqlca
         {
         /* ub1 */ char    sqlcaid[8];
         /* b4  */ int     sqlabc;
         /* b4  */ int     sqlcode;
         struct
           {
           /* ub2 */ unsigned short sqlerrml;
           /* ub1 */ char           sqlerrmc[70];
           } sqlerrm;
         /* ub1 */ char    sqlerrp[8];
         /* b4  */ int     sqlerrd[6];
         /* ub1 */ char    sqlwarn[8];
         /* ub1 */ char    sqlext[8];
         };

#ifndef SQLCA_NONE 
#ifdef   SQLCA_STORAGE_CLASS
SQLCA_STORAGE_CLASS struct sqlca sqlca
#else
         struct sqlca sqlca
#endif
 
#ifdef  SQLCA_INIT
         = {
         {'S', 'Q', 'L', 'C', 'A', ' ', ' ', ' '},
         sizeof(struct sqlca),
         0,
         { 0, {0}},
         {'N', 'O', 'T', ' ', 'S', 'E', 'T', ' '},
         {0, 0, 0, 0, 0, 0},
         {0, 0, 0, 0, 0, 0, 0, 0},
         {0, 0, 0, 0, 0, 0, 0, 0}
         }
#endif
         ;
#endif
 
#endif
 
/* end SQLCA */

	/* EXEC SQL BEGIN DECLARE SECTION; */ 

	/* VARCHAR count[20]; */ 
struct { unsigned short len; unsigned char arr[20]; } count;

	/* VARCHAR  SqlStr[5000]; */ 
struct { unsigned short len; unsigned char arr[5000]; } SqlStr;

	
	/* VARCHAR SP_TYPE[20]; */ 
struct { unsigned short len; unsigned char arr[20]; } SP_TYPE;

	/* VARCHAR  SP_TYPE_CODE[DEFAULT_FILEBUFFER_LEN]; */ 
struct { unsigned short len; unsigned char arr[1048576]; } SP_TYPE_CODE;

	/* EXEC SQL END DECLARE SECTION; */ 

	strcpy ((char *)SqlStr.arr,param.c_SqlStr);
	SqlStr.len = strlen((char*)SqlStr.arr);

	if (ConnectDB(param.USER_PASSWORD) == 0)
	{
		/* EXEC SQL SELECT count(*) INTO :count FROM TD_B_PARTY_SERVICE; */ 

{
  struct sqlexd sqlstm;
  sqlstm.sqlvsn = 12;
  sqlstm.arrsiz = 4;
  sqlstm.sqladtp = &sqladt;
  sqlstm.sqltdsp = &sqltds;
  sqlstm.stmt = "select count(*)  into :b0  from TD_B_PARTY_SERVICE ";
  sqlstm.iters = (unsigned int  )1;
  sqlstm.offset = (unsigned int  )51;
  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] = (unsigned char  *)&count;
  sqlstm.sqhstl[0] = (unsigned long )22;
  sqlstm.sqhsts[0] = (         int  )0;
  sqlstm.sqindv[0] = (         short *)0;
  sqlstm.sqinds[0] = (         int  )0;
  sqlstm.sqharm[0] = (unsigned long )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)
		{
			DisconnectDB();	/*断开数据库连接*/

			printf("建立游标错误!错误代码:%d\n", sqlca.sqlcode);
			exit(-1);
		}
		strcpy((char*)msg, (char*)count.arr);
	
		
		if ((in_fp = fopen(param.FILENAME, "w")) != NULL)
		{
			printf("打开%s文件成功\n\n", param.FILENAME); 
			printf("---------------------%s 开始处理数据---------------------\n\n", c_DateTime);
			printf("[SQL]:%s\n\n", param.c_SqlStr);
			/*if (setvbuf(in_fp, msg, _IONBF, DEFAULT_FILEBUFFER_LEN) != 0)
				printf("设置缓冲失败\n");
			else
			{
				printf("设置缓冲成功:%d\n", setvbuf(in_fp, msg, _IONBF, DEFAULT_FILEBUFFER_LEN));
			}
			*/
			/* prepare */
			/* EXEC SQL PREPARE s FROM :SqlStr; */ 

{
   struct sqlexd sqlstm;
   sqlstm.sqlvsn = 12;
   sqlstm.arrsiz = 4;
   sqlstm.sqladtp = &sqladt;
   sqlstm.sqltdsp = &sqltds;
   sqlstm.stmt = "";
   sqlstm.iters = (unsigned int  )1;
   sqlstm.offset = (unsigned int  )70;
   sqlstm.cud = sqlcud0;
   sqlstm.sqlest = (unsigned char  *)&sqlca;
   sqlstm.sqlety = (unsigned short)256;
   sqlstm.occurs = (unsigned int  )0;
   sqlstm.sqhstv[0] = (unsigned char  *)&SqlStr;
   sqlstm.sqhstl[0] = (unsigned long )5002;
   sqlstm.sqhsts[0] = (         int  )0;
   sqlstm.sqindv[0] = (         short *)0;
   sqlstm.sqinds[0] = (         int  )0;
   sqlstm.sqharm[0] = (unsigned long )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);
}

 
			
			/*声明一个跟该动态语句相关的游标*/
			/* EXEC SQL DECLARE cur_out CURSOR FOR s; */ 

			
			/*通过OPEN操作向动态语句传递参数*/
			/* EXEC SQL OPEN cur_out; */ 

{
   struct sqlexd sqlstm;
   sqlstm.sqlvsn = 12;
   sqlstm.arrsiz = 4;
   sqlstm.sqladtp = &sqladt;
   sqlstm.sqltdsp = &sqltds;
   sqlstm.stmt = "";
   sqlstm.iters = (unsigned int  )1;
   sqlstm.offset = (unsigned int  )89;
   sqlstm.selerr = (unsigned short)1;
   sqlstm.cud = sqlcud0;
   sqlstm.sqlest = (unsigned char  *)&sqlca;
   sqlstm.sqlety = (unsigned short)256;
   sqlstm.occurs = (unsigned int  )0;
   sqlstm.sqcmod = (unsigned int )0;
   sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}


			
			/* EXEC SQL WHENEVER NOT FOUND GOTO notfound; */ 

    	while(TRUE) 
			{
				/* EXEC SQL FETCH cur_out into :SP_TYPE_CODE; */ 

{
    struct sqlexd sqlstm;
    sqlstm.sqlvsn = 12;
    sqlstm.arrsiz = 4;
    sqlstm.sqladtp = &sqladt;
    sqlstm.sqltdsp = &sqltds;
    sqlstm.iters = (unsigned int  )1;
    sqlstm.offset = (unsigned int  )104;
    sqlstm.selerr = (unsigned short)1;
    sqlstm.cud = sqlcud0;
    sqlstm.sqlest = (unsigned char  *)&sqlca;
    sqlstm.sqlety = (unsigned short)256;
    sqlstm.occurs = (unsigned int  )0;
    sqlstm.sqfoff = (         int )0;
    sqlstm.sqfmod = (unsigned int )2;
    sqlstm.sqhstv[0] = (unsigned char  *)&SP_TYPE_CODE;
    sqlstm.sqhstl[0] = (unsigned long )1048578;
    sqlstm.sqhsts[0] = (         int  )0;
    sqlstm.sqindv[0] = (         short *)0;
    sqlstm.sqinds[0] = (         int  )0;
    sqlstm.sqharm[0] = (unsigned long )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 == 1403) goto notfound;
}


				if (sqlca.sqlcode < 0)
				{
					DisconnectDB();	/*断开数据库连接*/

					printf("建立游标错误!错误代码:%d\n", sqlca.sqlcode);
					exit(-1);
				}
				strcpy((char*)C_SP_TYPE_CODE, (char*)SP_TYPE_CODE.arr);
				fputs(C_SP_TYPE_CODE, in_fp);
				fputc('\n', in_fp);
				i++;
				if (i%1000==0)
					printf(" 输出[%d]条记录\n",i);
			
			}
			notfound:
			/* EXEC SQL CLOSE cur_out; */ 

{
   struct sqlexd sqlstm;
   sqlstm.sqlvsn = 12;
   sqlstm.arrsiz = 4;
   sqlstm.sqladtp = &sqladt;
   sqlstm.sqltdsp = &sqltds;
   sqlstm.iters = (unsigned int  )1;
   sqlstm.offset = (unsigned int  )123;
   sqlstm.cud = sqlcud0;
   sqlstm.sqlest = (unsigned char  *)&sqlca;
   sqlstm.sqlety = (unsigned short)256;
   sqlstm.occurs = (unsigned int  )0;
   sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}


   	 	/* EXEC SQL COMMIT RELEASE; */ 

{
      struct sqlexd sqlstm;
      sqlstm.sqlvsn = 12;
      sqlstm.arrsiz = 4;
      sqlstm.sqladtp = &sqladt;
      sqlstm.sqltdsp = &sqltds;
      sqlstm.iters = (unsigned int  )1;
      sqlstm.offset = (unsigned int  )138;
      sqlstm.cud = sqlcud0;
      sqlstm.sqlest = (unsigned char  *)&sqlca;
      sqlstm.sqlety = (unsigned short)256;
      sqlstm.occurs = (unsigned int  )0;
      sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}


   	 	printf("-------------关闭文件%s成功!-------------\n",param.FILENAME);
			printf("--------------------------共处理%d条数据---------------------------\n\n", i);
			fclose(in_fp);
			exit(0);
		}
	}
}

再就是pc文件test.pc,其需要引入test.h文件,主要是调用test.h方法

#include "test.h"

int main(int argc, char* argv[])
{
	initparam();
	setparam(argc, argv);
	PrintParam();
	Query();
	return 0;
}
int ConnectDB(char* c_UserPasswd)
{
	EXEC SQL INCLUDE SQLCA;
	EXEC SQL BEGIN DECLARE SECTION;
	VARCHAR UserPasswd[200];
	EXEC SQL END DECLARE SECTION;
	strcpy((char*)UserPasswd.arr, c_UserPasswd);
	UserPasswd.len = strlen((char*)UserPasswd.arr);

	EXEC SQL connect : UserPasswd;
	if (sqlca.sqlcode != 0)
	{
		printf("连接数据库失败,错误代码:%ld\n", sqlca.sqlcode);
	}
	else
	{
		printf("连接数据库成功:%ld\n", sqlca.sqlcode);
	}
	return sqlca.sqlcode;
}

void DisconnectDB()
{
	EXEC SQL ROLLBACK WORK RELEASE;
}

void Query()
{
	char *datainfo;
	char c_DateTime[50];	/*输出的时间变量*/
	int i = 0;
	int j=0;
	GetDateTime(c_DateTime);
	char msg[DEFAULT_FILEBUFFER_LEN];
	char C_SP_TYPE_CODE[DEFAULT_FILEBUFFER_LEN];
	EXEC SQL INCLUDE SQLCA;
	EXEC SQL BEGIN DECLARE SECTION;
	VARCHAR count[20];
	VARCHAR  SqlStr[5000];
	
	VARCHAR SP_TYPE[20];
	VARCHAR  SP_TYPE_CODE[DEFAULT_FILEBUFFER_LEN];
	EXEC SQL END DECLARE SECTION;
	strcpy ((char *)SqlStr.arr,param.c_SqlStr);
	SqlStr.len = strlen((char*)SqlStr.arr);

	if (ConnectDB(param.USER_PASSWORD) == 0)
	{
		EXEC SQL SELECT count(*) INTO :count FROM TD_B_PARTY_SERVICE;
		if (sqlca.sqlcode < 0)
		{
			DisconnectDB();	/*断开数据库连接*/

			printf("建立游标错误!错误代码:%d\n", sqlca.sqlcode);
			exit(-1);
		}
		strcpy((char*)msg, (char*)count.arr);
	
		
		if ((in_fp = fopen(param.FILENAME, "w")) != NULL)
		{
			printf("打开%s文件成功\n\n", param.FILENAME); 
			printf("---------------------%s 开始处理数据---------------------\n\n", c_DateTime);
			printf("[SQL]:%s\n\n", param.c_SqlStr);
			/*if (setvbuf(in_fp, msg, _IONBF, DEFAULT_FILEBUFFER_LEN) != 0)
				printf("设置缓冲失败\n");
			else
			{
				printf("设置缓冲成功:%d\n", setvbuf(in_fp, msg, _IONBF, DEFAULT_FILEBUFFER_LEN));
			}
			*/
			/* prepare */
			EXEC SQL PREPARE s FROM :SqlStr; 
			
			/*声明一个跟该动态语句相关的游标*/
			EXEC SQL DECLARE cur_out CURSOR FOR s;
			
			/*通过OPEN操作向动态语句传递参数*/
			EXEC SQL OPEN cur_out;
			
			EXEC SQL WHENEVER NOT FOUND GOTO notfound;
    	while(TRUE) 
			{
				EXEC SQL FETCH cur_out into :SP_TYPE_CODE;
				if (sqlca.sqlcode < 0)
				{
					DisconnectDB();	/*断开数据库连接*/

					printf("建立游标错误!错误代码:%d\n", sqlca.sqlcode);
					exit(-1);
				}
				strcpy((char*)C_SP_TYPE_CODE, (char*)SP_TYPE_CODE.arr);
				fputs(C_SP_TYPE_CODE, in_fp);
				fputc('\n', in_fp);
				i++;
				if (i%1000==0)
					printf(" 输出[%d]条记录\n",i);
			
			}
			notfound:
			EXEC SQL CLOSE cur_out;
   	 	EXEC SQL COMMIT RELEASE;
   	 	printf("-------------关闭文件%s成功!-------------\n",param.FILENAME);
			printf("--------------------------共处理%d条数据---------------------------\n\n", i);
			fclose(in_fp);
			exit(0);
		}
	}
}

ok,主要的代码就这些,接下来呢就是要编译pro*文件了,这就用到makefile,这里需要注意的就是要引入oracle的lib了,不能少了也不可乱了顺序,否则会有意想不到的错误发生,我的系统是AIX,所以编译采用的是xlc,linux系统可用cpp。编译命令是make proc,生成可执行文件DATATOFILE

Makefile

CPP       = xlC_r7 -q64 -bh:5 -g 
CPPFLAGS    =   -c -o 


LFLAGS    = $(PLATFORM_DEF) -D_REENTRANT -D_THREAD_SAFE -g -w -o
LIB       = -L$(PATH_LIB)
PATH_TEST =/ngbss/mddms/interface/other/SRBI/test
PROC_INCLUDE =  -I${ORACLE_HOME}/precomp/public
PROC_LIB =-L${ORACLE_HOME}/lib -L${ORACLE_HOME}/precomp/lib 
OCI_INCLUDE =   -O -I${ORACLE_HOME}/rdbms/include -I${ORACLE_HOME}/rdbms/demo -I${ORACLE_HOME}/rdbms/public -I${ORACLE_HOME}/plsql/public -I${ORACLE_HOME}/network/public 
OCI_LIBPATH = -L. -L.. -L${ORACLE_HOME}/lib 
INCLUDE   = $(OCI_INCLUDE)


	
proc:
	proc SQLCHECK=SEMANTICS  HOLD_CURSOR=YES userid=uop_uif1/123456@ngcrm1_taf code=CPP iname=test.pc oname=test.cpp


	xlc  -qdfp -I${ORACLE_HOME}/rdbms/lib32 \
			-I${ORACLE_HOME}/lib32 \
			-I${ORACLE_HOME}/precomp/public \
			-L${ORACLE_HOME}/lib32\
			-I${ORACLE_HOME}/precomp/lib \
			-L${ORACLE_HOME}/rdbms/lib32 \
		  -L${ORACLE_HOME}/rdbms/lib -L${ORACLE_HOME}/lib -locci -lclntsh  test.cpp  -o DATATOFILE

	

好了,最后看看我们如何利用shell脚本调用DATATOFILE取出oracle数据的,shell脚本将会生成一个*.ini的配置文件,配置信息呢就是
cat<<EndCfg>$szCfgFile到EndCfg直接的类容,[]就是配置信息标记,${BIN_PATH}/DATATOFILE -d $INI_PATH/filename_${x}.ini这句呢就是调用我们的可执行程序生成数据了
然后我们执行sh test.sh运行脚本。生成数据文件*.AVL

test.sh

#!/bin/sh
#--------------------------------------------------------------------
# Fuction:产品域	TD_B_SPTYPE	SP业务类型参数表
# Version: 1.0
# Created: wangkun
# Created date:2012/10/12
# Modify history:
#--------------------------------------------------------------------

begintime=`date +%s`
. /ngbss/mddms/.profile
export NLS_LANG="AMERICAN_AMERICA.utf8"
######################################################################################
SafeCmd()
{
$*
return 0
}

DEALDATE=`date +%Y%m%d`
curdate=`date +%Y%m%d`

#得到前一天日期
GetPrevDate()
{
        if (test $# -eq 0)
        then
                CurDate=`date +%Y%m%d`
        else
                CurDate=$1
        fi

        CurYear=`echo $CurDate | cut -c1-4`
        CurMonth=`echo $CurDate | cut -c5-6`
        CurDay=`echo $CurDate | cut -c7-8`

        GetYear="$CurYear"
        GetMonth="$CurMonth"
        GetDay="`expr $CurDay - 1`"

        if [ "$GetDay" -le 0 ]; then

            GetMonth=`expr $CurMonth - 1`

            if [ "$GetMonth" -le 0 ] ; then

                    GetYear=`expr $CurYear - 1`
                    GetMonth=12

            fi

            case "$GetMonth"
            in
                1|3|5|7|8|10|12)
                      GetDay=31;;
                4|6|9|11)
                      GetDay=30;;
                2)

                      if [ `expr "$CurYear" % 400` -eq 0 ]; then

                              GetDay=29

                      elif [ `expr "$CurYear" % 4` -eq 0 -a `expr "$CurYear" % 100` -ne 0 ]; then

                              GetDay=29

                      else
                              GetDay=28
                      fi
            esac
        fi

        if [ `echo "$GetMonth" | wc -m` -ne 3 ] ; then

                GetMonth=0$GetMonth
        fi

        if [ `echo "$GetDay" | wc -m` -ne 3 ] ; then

                GetDay=0$GetDay
        fi

        echo  "$GetYear""$GetMonth""$GetDay"
}

sdate=`GetPrevDate`

#######################公共配置###############################################
szProcTime=`date +%Y%m%d%H%M%S`
WORK_PATH=/ngbss/mddms/interface/other/SRBI/test
LOGPATH=/ngbss/mddms/interface/other/SRBI/log
FILE_PATH=/ngbss/mddms/interface/other/SRBI/test/files
CHKSHPATH=/ngbss/mddms/interface/other/SRBI/ddchk.sh
BAK_PATH=/ngbss/mddms/interface/other/SRBI/test/bak
BIN_PATH=/ngbss/mddms/interface/other/SRBI/test
INI_PATH=/ngbss/mddms/interface/other/SRBI/test/ini
COMMON_PATH=/ngbss/mddms/interface/common/
######################公共配置###############################################


cd $COMMON_PATH
#CONN=`sh /ngbss/mddms/interface/getid/getid.sh BIuop_cen1 uop_cen1`
CONN1=uop_cen1/123456@NGcrm1-gs
#CONN2=uop_crm2/123456@ngcrm1_taf
#割接开启
cd $WORK_PATH
CHANNEL="uop_cen1"  
        
        
table_column_name="SP_TYPE_CODE,SP_TYPE"
table_column_type="VARCHAR2,VARCHAR2"

for x in $CHANNEL
do
if [ "$x" = uop_cen1 ]
then
  filename='BA087D01001'$sdate'00000001'
  CONN=$CONN1
fi

echo ======================================================================================

echo `date +%H\:%M\'%S\"` 正在处理$filename...

##############################配置信息#############################################
szCfgFile=$INI_PATH/filename_${x}.ini

cat<<EndCfg>$szCfgFile

[SYS]

#每条纪录的长度 对速度影响较大
[SINGLE_LENGTH]:1000

[DB]

[USER_PASSWORD]:$CONN

#可以加入UNION ALL 等语句 decode(a.modify_tag, '0', '1', '1', '2', '1')
[SQL]: select replace(replace( PARTY_ID||chr(01)||SP_TYPE_CODE||chr(01)||SP_ID||chr(01)||SP_NAME||chr(01)||STATES||chr(01)||START_DATE||chr(01)||END_DATE||chr(01)||UPDATE_TIME ,chr(10)),chr(13)) from TD_B_PARTY_SERVICE   

[FILENAME]:${FILE_PATH}/$filename

#文件后缀名
[POSTFIX]:AVL

[OTHER]

[COMMOND]: ls
EndCfg
##############################配置信息#############################################
cd $WORK_PATH
${BIN_PATH}/DATATOFILE -d $INI_PATH/filename_${x}.ini
cd $FILE_PATH
mv $filename ${filename}.AVL
done
endtime=`date +%s`
echo "共计时间:"  $((endtime-begintime)) "秒"


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值