ORACLE数据导入C程序

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

#define FLD_MAX_BUFF_LEN 2048
#define MAX_BUFF_NUM  1
#pragma pack(1)

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

typedef char *  FILED;

int main(int argc, char *argv[])
{
    HSTMT   hstmt,hstmt1;
    RETCODE rc;
    FILED   fields[2000];

    char tmp[3],tmpstr[64*1024 + 1],*tmp_pos;
    char tmpsql[9182];
    int  pcrow,i,j,k;
    int  num,max_buf_len,tot_num;
    double tm1,tm2,tm;
    FILE *fptr;
    SWORD pfSqlType,pibScale,pfNullable,counts;     /*#define SWORD short int*/
    UDWORD pcbColDef;
    int tmp_int;
    double tmp_double;
    int fieldlen[2000];
    int is_continue;
    int maxlen;

    UCHAR  szColName[100];
    SWORD  cbColNameMax=99;
    SWORD  pcbColName;

    if ( argc != 5 )
    {
        printf("Usage : load user passwd tablename tablefile /n");
        exit (-1);
    }
   
    fptr = fopen(argv[4],"rt");
    if (fptr == NULL)
    {
        printf(" open output file %s error/n" ,argv[4]);
        fflush(stdout);
        printf(" /t倒入表 %s 失败./n",argv[3]);
        return -1;
    }
   
    tm = get_milli_time();

    SQLAllocEnv(0 );
    rc = SQLConnect( 0,"",0,(UCHAR *)argv[1],0,(UCHAR *)argv[2],0);
    if (rc != SQL_SUCCESS)
    {
        printf(" /t倒入表 %s 失败./n",argv[3]);
        return -1;
    }

    rc = SQLAllocStmt(0,&hstmt);
    if (rc != SQL_SUCCESS)
    {
        printf("Alloc stmt is failed./n");
        printf(" /t倒入表 %s 失败./n",argv[3]);
        fflush(stdout);
        return -1;
    }

    rc = SQLAllocStmt(0,&hstmt1);
    if (rc != SQL_SUCCESS)
    {
        printf("Alloc stmt is failed./n");
        printf(" /t倒入表 %s 失败./n",argv[3]);
        fflush(stdout);
        return -1;
    }

    sprintf(tmpsql,"select * from %s where 1 != 1",argv[3]);
    rc = SQLPrepare(hstmt,(UCHAR *)tmpsql,0);
    if (rc != SQL_SUCCESS)
    {
        printf("sql is %s/n",tmpsql);
        printf(" /t倒入表 %s 失败./n",argv[3]);
        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",argv[3]);
        fflush(stdout);
        return -1;
    }

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

   
sprintf(tmpsql,"insert into %s values ( :V0",argv[3]);
    for (i = 1; i < counts ; i++)
    {
        sprintf(tmpsql,"%s,:V%d",tmpsql,i);
    }
    strcat(tmpsql,")");

    for (i = 1; i <= counts ; i++)
    {
       
        SQLDescribeCol(hstmt,i,szColName,cbColNameMax,&pcbColName
                       ,&pfSqlType,&pcbColDef, &pibScale,&pfNullable);
        fieldlen[i - 1 ] = pibScale + 1;
        fields[i - 1] = (char *)malloc(MAX_BUFF_NUM * fieldlen[i-1] + 1);
        if (fields[i-1] == NULL)
        {
            printf(" /t内存不够,倒入表 %s 失败./n",argv[3]);
            fflush(stdout);
            return -1;
        }
    }

    rc = SQLPrepare(hstmt1,(UCHAR *)tmpsql,0);
    if (rc != SQL_SUCCESS)
    {
        printf("sql is %s/n",tmpsql);
        printf(" /t倒入表 %s 失败./n",argv[3]);
        fflush(stdout);
        return -1;
    }

    tot_num = 0;
    while (1)
    {
     
        tm1= get_milli_time();
        num = 0;
        for (i = 0; i < counts ; i++)
        {
            memset(fields[i],' ',MAX_BUFF_NUM * fieldlen[i]);
        }

        for ( k = 0 ; k < MAX_BUFF_NUM ; k++ )
        {
            memset(tmpstr,'/0',sizeof(tmpstr));
            is_continue = 1;
            if ( fgets(tmpstr,64*1024,fptr) == NULL)
            {
                is_continue = 0;
                break;
            }
            num++;
            tmp_pos = tmpstr;
            for (i = 0; i < counts ; i++)
            {
                j = 0;
                maxlen = 0;
                while ((*tmp_pos != '|') && maxlen < fieldlen[i]-1 )
                {
                    maxlen ++;
                    fflush(stderr);
                    fields[i][ k * fieldlen[i] + j] = *tmp_pos;
                    tmp_pos ++;
                    j++;
                }

                if ( j < fieldlen[i]-1 )
                {
                    j = fieldlen[i] - 1 ;
                    fields[i][ k * fieldlen[i] + j] = '/0';
                }
                  
                tmp_pos ++;
                /*
                if (fields[i][k * fieldlen[i]] == '/0')
                {
                    sprintf(&fields[i][k * fieldlen[i]] ,"NULL");
                }
                for (j = 0; j < fieldlen[i]  ; j++ )
                {
                    if ( fields[i][k * fieldlen[i] + j ] == '/0')
                    {
                        fields[i][k * fieldlen[i] + j ] = ' ';
                    }
                }
                */

            }
        }

        if ( num > 0 )
        {
            for ( i = 0 ; i < counts ; i++ )
            {
                if (SQLBindParameter(hstmt1,i+1,0,SQL_C_CHAR,0,0,0,
                     fields[i],fieldlen[i]-1 ,&max_buf_len) != SQL_SUCCESS)
                {
                    printf(" /t倒入表 %s 失败./n",argv[3]);
                    return -1;
                }
            }

            if (SQLExecuteEx(hstmt1,num) != SQL_SUCCESS)
            {
                printf(" /t倒入表 %s 失败,num is %d /n",argv[3],num);
                ROLLBACK_TRAN(SQL_NULL_HDBC);
                num = 0;
                break;
            }

            tot_num += num;
            COMMIT_TRAN(SQL_NULL_HDBC);
        }

        tm2= get_milli_time();
        if ( is_continue == 0)
        {
            break;
        }
    }   /*end while*/

    COMMIT_TRAN(SQL_NULL_HDBC);
    fclose(fptr);
    tm2= get_milli_time();

    printf("/t共有 %d 行被倒入,共耗时: %12.3lf 秒/n" , tot_num , tm2 - tm);
    SQLFreeStmt( hstmt, SQL_DROP);
    SQLFreeStmt( hstmt1, SQL_DROP);
    SQLFreeEnv(0);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值