ORACLE数据导出C程序

    技术2022-05-11  133

    #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 行被倒出,耗时: .4lf /n/n" , num , tm2 - tm1);    SQLFreeStmt( hstmt, SQL_DROP);    /*释放句柄*/    SQLFreeEnv(0);                    /*释放数据库环境*/    return 0;}


    最新回复(0)