ETL处理过程中,经常需要进行文件校验,如文件级校验、记录级校验,需要保存文件的基本信息,文件名、文件大小、数据日期等,使用Pro*C的一种方法如下:
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> #include <limits.h> #include <sqlda.h> #include <sqlcpr.h> /*定义数据库连接信息*/ #define USERNAME "masaetl" #define PASSWORD "masaetl" #define ORACLESID "DWDB2" /*定义数据存放目录,这些目录是链接文件的目录*/ char data_dir[5][64]={ "/ETL_FS/etlfs/interface/boss/input/day_full", "/ETL_FS/etlfs/interface/boss/input/day_incr", "/ETL_FS/etlfs/interface/boss/input/oth_full", "/ETL_FS/etlfs/interface/boss/input/oth_incr", "/ETL_FS/etlfs/interface/kf_data/link" }; /*定义处理日期,内部链接的静态变量*/ static char filedate[9]; /*调试代码时使用*/ #ifndef DEBUG #define DEBUG // 定义调试开关 #endif /*SQL语句返回值定义*/ /*定义返回值,成功为0,错误<0,警告>0 */ #define SQLCODE sqlca.sqlcode /*SQL语句返回错误解释 */ #define SQLERRMC sqlca.sqlerrm.sqlerrmc /*包含数据库信息*/ EXEC SQL INCLUDE sqlca; EXEC SQL INCLUDE sqlda; /*SQL语句返回值定义*/ /*定义返回值,成功为0,错误<0,警告>0*/ #define SQLCODE sqlca.sqlcode /*SQL语句返回错误解释*/ #define SQLERRMC sqlca.sqlerrm.sqlerrmc void sqlerror(); /*处理SQL错误*/ int ConnectDataBase(); /*链接数据库*/ void DisConnectDataBase(); /*断开数据库连接*/ char *getYestDate(char *szDate); /*得到前一天的日期,格式"YYYYMMDD"*/ char *getFileName(const char *szFilePath,char *szFileName); /*从字符串中得到文件名*/ /************************************** *** 功能: 提取运行在数据库级报错信息 *** 输入变量: *** 输出变量: ***************************************/ void sqlerror() { /*为了避免错误处理时发生死循环,应给出此说明*/ EXEC SQL WHENEVER SQLERROR CONTINUE; printf(" Oracle error detected: "); printf(" %s",SQLERRMC); /*错误信息*/ /*断开数据库链接*/ EXEC SQL ROLLBACK WORK RELEASE; exit(1); } /************************************** *** 功能: 连接数据库 *** 输入变量: *** 输出变量: -1 连接数据库失败 0 成功 ***************************************/ int ConnectDataBase() { EXEC SQL BEGIN DECLARE SECTION; char username[8]; char password[11]; char oraclesid[7]; EXEC SQL END DECLARE SECTION; strcpy(username,USERNAME); /*用户名*/ //username.len=strlen(username.arr); strcpy(password,PASSWORD); /*密码*/ //password.len=strlen(password.arr); strcpy(oraclesid,ORACLESID); /*Oralce SID*/ //oraclesid.len=strlen(oraclesid.arr); /*链接数据库*/ EXEC SQL CONNECT :username IDENTIFIED BY :password USING :oraclesid; if( SQLCODE ) { return -1; } return 0; } /************************************** *** 功能: 断开数据库连接 *** 输入变量: *** 输出变量: ***************************************/ void DisConnectDataBase() { /*断开连接*/ EXEC SQL ROLLBACK WORK RELEASE; exit(0); } /*************************************** ** 功能 : 得到前一天的日期 *** 输入变量: *** 输出变量: ****************************************/ char *getYestDate(char *szDate) { time_t yest; struct tm ptime={'