ORACLE数据导出C程序

来源:互联网 发布:创业软件几时复牌 编辑:程序博客网 时间:2024/05/16 17:07

#include <stdio.h>
#include <dbsql.h>
#include <libgen.h>

/*去掉传入的str右边的空格' '*/
char *ltrim( char *str )
{
    int len ;
    len = strlen (str);
    while ( len > 0 && str[len -1 ] == ' ' )
    {
        len --;
    }
    str[len] = '/0';
    return str;
}

int main(int argc, char *argv[])
{
    HSTMT hstmt;             /*#define HSTMT int*/
    RETCODE rc;              /*#define RETCODE int*/
    char tmp[3],tmpstr[1024];
    char tmpsql[1024],passwd[64],user[64],tablename[64],tablefile[128];
    short int counts;
    int pcrow,i;
    int num,len;
    double tm1,tm2;
    FILE *fptr;
    int is_sql = 0 ;

    if ( argc != 5 && argc != 6)
    {
        printf("Usage : %s user passwd tablename tablefile /n",basename(argv[0]));
        printf("Or Usage : %s -sql user passwd tablefile sqlstmt/n",basename(argv[0]));
        exit (-1);
    }

    if ( argc == 5 )             /*如果是5个参数,则是到处整个tablename表数据*/
    {
        len = strlen ( argv[1]);
        len = len >= 63 ? 63 : len;
        sprintf(user,"%*.*s",len,len,argv[1]);

        len = strlen ( argv[2]);
        len = len >= 63 ? 63 : len;
        sprintf(passwd,"%*.*s",len,len,argv[2]);

        len = strlen ( argv[3]);
        len = len >= 63 ? 63 : len;
        sprintf(tablename,"%*.*s",len,len,argv[3]);

        len = strlen ( argv[4]);
        len = len >= 127 ? 127 : len;
        sprintf(tablefile,"%*.*s",len,len,argv[4]);

    }
    else if ( argc == 6 && memcmp(argv[1],"-sql",4) == 0)  /*如果是6位参数,并且第2个是"-sql"*/
         {
             is_sql = 1;

             len = strlen ( argv[2]);
             len = len >= 63 ? 63 : len;
             sprintf(user,"%*.*s",len,len,argv[2]);

             len = strlen ( argv[3]);
             len = len >= 63 ? 63 : len;
             sprintf(passwd,"%*.*s",len,len,argv[3]);

             len = strlen ( argv[4]);
             len = len >= 127 ? 127 : len;
             sprintf(tablefile,"%*.*s",len,len,argv[4]);

             memset(tablename,'/0',sizeof(tablename));
         }
         else
         {
             printf("Usage : %s -sql user passwd tablefile sqlstmt/n",basename(argv[0]));
             exit (-1);
         }

    tm1= get_milli_time();
    printf(" /n/t正在倒表 %s ,请稍后... ... /n",tablename);
    fptr = fopen(argv[4],"w+t");                /*打开第5个文件参数文件*/
    if (fptr == NULL)
    {
        printf("open output file %s error/n",tablefile);
        fflush(stdout);
        printf("/t倒出表 %s 失败./n",tablename);
        return -1;
    }

    SQLAllocEnv(0);         /*初始化数据库环境*/
    /*连接数据库*/
    rc = SQLConnect( 0,(UCHAR *)"",0,(UCHAR *)user,0,(UCHAR *)passwd,0);
    if (rc != SQL_SUCCESS)
    {
        printf(" /t倒出表 %s 失败./n",tablename);
        return -1;
    }

    SQLAllocStmt(0,&hstmt);        /*初始化数据库句柄*/
    if (rc != SQL_SUCCESS)
    {
        printf("Alloc stmt is failed./n");
        printf(" /t倒出表 %s 失败./n",tablename);
        fflush(stdout);
        return -1;
    }

    if ( 1 == is_sql )
    {
        sprintf(tmpsql,"%s",argv[5]);
    }
    else
    {
        sprintf(tmpsql,"select * from %s",tablename );
    }

    rc = SQLPrepare(hstmt,(UCHAR *)tmpsql,0);
    if (rc != SQL_SUCCESS)
    {
        printf("sql is %s/n",tmpsql);
        printf(" /t倒出表 %s 失败./n",tablename );
        fflush(stdout);
        return -1;
    }

   
rc = SQLExecute(hstmt);           /*执行句柄*/
    if (rc != SQL_SUCCESS)
    {
        printf("file is %s line is %d/n",__FILE__,__LINE__);
        printf(" /t倒出表 %s 失败./n",tablename );
        fflush(stdout);
        return -1;
    }

    SQLNumResultCols( hstmt,( SWORD  FAR *)&counts);
    num = 0;

    while (1)
    {
        rc = SQLFetch(hstmt);           /*读取下一条记录*/
        if (rc == SQL_SUCCESS )
        {
            num ++;
            for ( i=0; i<counts; i++ )
            {
                SQLGetData(hstmt,i+1,SQL_C_CHAR,tmpstr,1023,&pcrow);   /*读取数据*/
                fprintf(fptr,"%.*s|",pcrow,ltrim(tmpstr));  /*每个字段以"|"分隔*/
            }
            fprintf(fptr,"/n");
        }
        else
        {
            break;        /*如果没有数据了就break,退出循环*/
        }
    }

    fclose(fptr);      /*关闭文件*/
    tm2= get_milli_time();

    printf("/t共有 %d 行被倒出,耗时: %12.4lf /n/n" , num , tm2 - tm1);
    SQLFreeStmt( hstmt, SQL_DROP);    /*释放句柄*/
    SQLFreeEnv(0);                    /*释放数据库环境*/
    return 0;
}