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)) "秒"


原创粉丝点击