AIX系统下proc*数据采集
来源:互联网 发布:python数据处理代码 编辑:程序博客网 时间:2024/06/09 20:59
分享一篇关于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 conststruct 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 **, unsignedint *,
- struct sqlexd *, const struct sqlcxp *);
- void sqlcx2t(void **, unsignedint *,
- struct sqlexd *, const struct sqlcxp *);
- void sqlbuft(void **,char *);
- void sqlgs2t(void **,char *);
- void sqlorat(void **, unsignedint *, void *);
- }
- // Forms Interface
- static constint IAPSUCC = 0;
- static constint IAPFAIL = 1403;
- static constint IAPFTL = 535;
- extern "C" {void sqliem(char *,int *); }
- typedef struct { unsignedshort len; unsigned char arr[1]; } VARCHAR;
- typedef struct { unsignedshort len; unsigned char arr[1]; } varchar;
- /* cud (compilation unit data) array */
- static constshort 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 */ unsignedshort 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 */ unsignedshort 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; unsignedchar arr[5000]; } SqlStr;
- /* VARCHAR SP_TYPE[20]; */
- struct { unsigned short len; unsignedchar 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))"秒"
- AIX系统下proc*数据采集
- AIX系统下proc*数据采集
- linux系统下 数据采集环境配置
- 网页数据采集系统
- 高速数据采集系统
- 数据采集系统
- PDA数据采集系统
- java--数据采集系统
- 环境数据采集系统
- ForeSpider数据采集系统
- AIX系统下的Makefile
- AIX系统下查看磁盘阵列
- 【信息采集】IBM AIX系统硬件信息查看命令
- IBM AIX系统日志配置远程Syslog采集
- aix 文件系统之 PROC
- 什么是GIS数据采集系统
- 基础系统数据采集工作总结
- java电信数据采集系统
- Delphi下POS打印机,控制开钱箱,客显,顾客显示屏,小票打印机
- VMtools安装
- CentOS 的用户、组权限、添加删除用户等操作的详细操作命令
- Axis,axis2,Xfire以及cxf对比
- PPP协议解析
- AIX系统下proc*数据采集
- WinForm使用WebService自动升级 【转】
- [shell小工具] 显示文件指定行的内容
- 笔者支招:U盘与内存卡之间的差异
- SQL Server数据库性能监控计数器
- 局域网聊天软件 简单实现原理(附:代码)
- 改变键盘的颜色
- Oracle系统视图作用大全
- Android系统权限和root权限