AIX系统下proc*数据采集
来源:互联网 发布:36槽30kw发电机数据 编辑:程序博客网 时间:2024/06/07 06:27
分享一篇关于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){charachar_date_time[32];struct tm* s_tm_time;time_ttimer;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};// Prototypesextern "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 Interfacestatic 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_CLASSSQLCA_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_CLASSSQLCA_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 -oLIB = -L$(PATH_LIB)PATH_TEST =/ngbss/mddms/interface/other/SRBI/testPROC_INCLUDE = -I${ORACLE_HOME}/precomp/publicPROC_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.cppxlc -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_SPTYPESP业务类型参数表# Version: 1.0# Created: wangkun# Created date:2012/10/12# Modify history:#--------------------------------------------------------------------begintime=`date +%s`. /ngbss/mddms/.profileexport 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/testLOGPATH=/ngbss/mddms/interface/other/SRBI/logFILE_PATH=/ngbss/mddms/interface/other/SRBI/test/filesCHKSHPATH=/ngbss/mddms/interface/other/SRBI/ddchk.shBAK_PATH=/ngbss/mddms/interface/other/SRBI/test/bakBIN_PATH=/ngbss/mddms/interface/other/SRBI/testINI_PATH=/ngbss/mddms/interface/other/SRBI/test/iniCOMMON_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_PATHCHANNEL="uop_cen1" table_column_name="SP_TYPE_CODE,SP_TYPE"table_column_type="VARCHAR2,VARCHAR2"for x in $CHANNELdoif [ "$x" = uop_cen1 ]then filename='BA087D01001'$sdate'00000001' CONN=$CONN1fiecho ======================================================================================echo `date +%H\:%M\'%S\"` 正在处理$filename...##############################配置信息#############################################szCfgFile=$INI_PATH/filename_${x}.inicat<<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]: lsEndCfg##############################配置信息#############################################cd $WORK_PATH${BIN_PATH}/DATATOFILE -d $INI_PATH/filename_${x}.inicd $FILE_PATHmv $filename ${filename}.AVLdoneendtime=`date +%s`echo "共计时间:" $((endtime-begintime)) "秒"
- AIX系统下proc*数据采集
- AIX系统下proc*数据采集
- linux系统下 数据采集环境配置
- 网页数据采集系统
- 高速数据采集系统
- 数据采集系统
- PDA数据采集系统
- java--数据采集系统
- 环境数据采集系统
- ForeSpider数据采集系统
- AIX系统下的Makefile
- AIX系统下查看磁盘阵列
- 【信息采集】IBM AIX系统硬件信息查看命令
- IBM AIX系统日志配置远程Syslog采集
- aix 文件系统之 PROC
- 什么是GIS数据采集系统
- 基础系统数据采集工作总结
- java电信数据采集系统
- eclipse生成javadoc时出错:编码GBK的不可映射字符
- linux 自学笔记 (八) linux软件包管理
- lucene创建索引时出错:扑捉到FileNotFoundException
- 在XP系统下实现VPN的搭建
- UVa 10361 - Automatic Poetry
- AIX系统下proc*数据采集
- C 语言 嵌套 汇编
- Android中View绘制流程以及invalidate()等相关方法分析
- 票据贴现额度恐遭挤压 价格成本难免上扬
- windows下nessus5离线验证安装
- 在eclipse中空心J标志的工程
- RedHat linux配置yum本地资源
- GLUT场景漫游(一)
- MySQL: Communications link failure,The last packet successfully received from the server