从ORACLE导完数后,需要做平衡性校验,避免由于程序异常或人为失误导致导数不完整。分享个自己写的小工具。

/****************************************************************************
*ckcnt coded by Gavin @2014.
*netgene@hotmail.com
*
*compile:
*proc ckcnt.pc
*xlc -o ckcnt ckcnt.c $ORACLE_HOME/lib/libclntsh.so -q 64
****************************************************************************/


#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>

EXEC SQL INCLUDE SQLCA;

char g_connstr[1024];
char g_table_name[1024];
char g_file_name[1024];

int file_cnt(const char *filename)
{
int cnt=0;

FILE* fd=fopen(filename, "r");
char sLine[1024]={0};
while ( fgets( sLine, 1024, fd) != NULL ) {
//printf("%s\n",sLine);
cnt++;
}
//printf("%d\n",cnt);
fclose(fd);

return cnt;
}

int table_cnt(const char *tablename, const char *connstr)
{
int cnt=0;

EXEC SQL BEGIN DECLARE SECTION;
char *sql_str;
VARCHAR orastr[1024];
char table_name[1024];
EXEC SQL END DECLARE SECTION;

strcpy(orastr.arr,connstr);
orastr.len = strlen(orastr.arr);
orastr.arr[orastr.len]='\0';

strcpy(table_name,tablename);

EXEC SQL CONNECT :orastr;
if (0 != sqlca.sqlcode) {
printf("connect oracle[%s] err:%s\n", orastr.arr,sqlca.sqlerrm.sqlerrmc);
return -1;
}

sql_str=(char *)malloc(1024);
strcpy(sql_str,"select count(*) as cnt from ");
strcat(sql_str,table_name);
EXEC SQL PREPARE SQL_STR FROM :sql_str;
EXEC SQL DECLARE table_cursor CURSOR FOR SQL_STR;
//EXEC SQL OPEN table_cursor USING :table_name;
EXEC SQL OPEN table_cursor;

if (0 != sqlca.sqlcode) {
printf("execute count table[%s] failed!sqlcode=%ld,sqlserr=%s\n",table_name,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
return -1;
}

EXEC SQL WHENEVER NOT FOUND DO break;
//printf("table_name:%s sql:%s\n",table_name,sql_str);
while(1){
EXEC SQL FETCH table_cursor INTO :cnt;
//printf("[%d]\n",cnt);
}

EXEC SQL close table_cursor;
EXEC SQL commit work release;

return cnt;
}

int print_usage()
{
printf( "ckcnt [-h] [-d connstr] [-t table_name] [-f filename]\n" );
printf( " -h Show help\n" );
printf( " -d connstr\n");
printf( " -t table_name\n");
printf( " -f file_name\n");
return 0;
}

int getoption(int argc, char *argv[])
{
extern char *optarg;
int optch;

static char optstring[] = "hd:t:f:";
while ((optch = getopt(argc , argv , optstring)) != -1 ) {
switch( optch ) {
case 'h':
print_usage();
exit(-1);
case 'd':
strcpy(g_connstr , optarg);
break;
case 't':
strcpy(g_table_name , optarg);
break;
case 'f':
strcpy(g_file_name , optarg);
break;
default:
break;
}
}

if (strlen(g_connstr) == 0) {
printf("connstr is not inputed, please check!\n");
print_usage();
exit(-1);
}

if (strlen(g_table_name) == 0) {
printf("tablename is not inputed, please check!\n");
print_usage();
exit(-1);
}

if (strlen(g_file_name) == 0) {
printf("filename is not inputed, please check!\n");
print_usage();
exit(-1);
}
else {
if (access(g_file_name, F_OK) != 0) {
printf("filename %s is not existed!\n", g_file_name);
exit(-1);
}
}

return 0;
}

int main(int argc,char **argv)
{
getoption(argc,argv);

int tablecnt=0;
int filecnt=0;


if ((tablecnt = table_cnt(g_table_name,g_connstr)) == -1) {
printf("count table failed!\n");
return -1;
}

if ((filecnt = file_cnt(g_file_name)) == -1) {
printf("count file failed!\n");
return -1;
}

if (tablecnt == filecnt) {
printf("%s[%d] %s[%d] OK\n", g_table_name, tablecnt, g_file_name, filecnt);
}
else {
printf("%s[%d] %s[%d] ERROR\n", g_table_name, tablecnt, g_file_name, filecnt);
}

return 0;
}