ETL应用:使用Pro*C实现文件抽取的方法

/*******************************************
*****  函数功能 :
*****      抽取数据库记录
*****
********************************************/
int extract_data(char *efilename,const char *sqlname)
{
  FILE  *fpWrite;
  EXEC SQL BEGIN DECLARE SECTION;
     varchar     v_str_sql[3000+1];    /*SQL语句  */
     varchar     vc_expcol[MAXLEN];
  EXEC SQL END DECLARE SECTION;
  /**/
  strcpy((char *)v_str_sql.arr,sqlname);
  v_str_sql.len=strlen((char*)v_str_sql.arr);
#ifdef   DEBUG
  printf("SQL语句%s.
",v_str_sql.arr);
#endif
  EXEC SQL WHENEVER SQLERROR GOTO prepare_exp_error;
        if ((fpWrite = fopen(efilename, "w+")) == NULL)
   {
            fprintf(stderr,"Cannot open data file %s
", efilename);
                  exit(1);
   }
   /*声明游标处理方式*/
      EXEC SQL PREPARE sqlstmt FROM :v_str_sql;
      EXEC SQL DECLARE extract_cur CURSOR FOR sqlstmt;
      EXEC SQL OPEN extract_cur;
   for(;;)
  {
          /*提取数据*/
      EXEC SQL FETCH extract_cur INTO :vc_expcol ;
      if (sqlca.sqlcode == 1403)
                   {
                       fprintf(stderr,"数据已经抽取完成或是没有符合条件的数据!
");
                       break;
                    }
                   vc_expcol.arr[vc_expcol.len] = '';
                   /*将输出数据记录到文件中*/
       fprintf(fpWrite,"%s
",vc_expcol.arr );
   }
   /*关闭文件*/
   fclose(fpWrite);
   /*关闭游标*/
   EXEC SQL CLOSE extract_cur;
   return SUCCESS;
prepare_exp_error:
         /*记录错误信息*/
   fprintf(stderr,"
%70s
",sqlca.sqlerrm.sqlerrmc);
   fprintf(stderr,"数据库操作错误!退出!");
         return FAILUER;
}
原文地址:https://www.cnblogs.com/tychyg/p/4868561.html