ETL应用:使用Pro*C写入文件信息入库的方法

     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={'