分享一篇关于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)) "秒"