как DYNAMIC получить значение utf8 с Oracle oci? - PullRequest
1 голос
/ 20 марта 2019

когда я DYNAMIC извлекаю значение utf8 в oci, OCIStmtFetch2 возвращает отрицательное число в виде len, но я не знаю, что означает отрицательное значение, как я могу получить значение utf8 DYNAMIC?

мой код:

    for(;OCI_NEED_DATA == ret_oci;){
        ret_oci=OCIStmtGetPieceInfo(conn->stmt,conn->err,(void**)&defnp,&dtype,(ub1*)&utmp,&utmp,&utmp,&up);
        oci_checkerr(conn->err,ret_oci);
        len_tmp=2;
        if(tmpl!=(long)defnp){ //next column
            tmpl=(long)defnp;
            pa->topData = pa->topData - (pAH->maxLen-pAH->len);
            pAH->maxLen=pAH->len;
            // malloc buffer
            pAH=arrayDataAppend(pa,-1,NULL,len_tmp,TYPE_RAW);
            pTmp = (char*)(pAH+1);
        }else{// current column need more buffer size
            // malloc buffer
            pAH=arrayDataAppend(pa,-2,NULL,len_tmp,TYPE_RAW);
            pTmp = (char*)(pAH+1)+pAH->len;
        }

        ret_oci=OCIStmtSetPieceInfo((void*)defnp,dtype,conn->err,pTmp,&len_tmp,up,NULL,NULL);
        oci_checkerr(conn->err,ret_oci);
        ret_oci=OCIStmtFetch2(conn->stmt, conn->err, 1,OCI_DEFAULT,0,OCI_DYNAMIC_FETCH);
        printf("len_tmp:%d\n",len_tmp);
        itmp = len_tmp;
        oci_checkerr(conn->err,ret_oci);
        //pTmp[itmp]=0;
        pAH->len+=itmp;
    }

значение utf8 char "陈浩",

run:

при установке len_tmp = 2;

Error - OCI_NEED_DATA
len_tmp:2
Error - OCI_NEED_DATA
len_tmp:2
Error - OCI_NEED_DATA
len_tmp:-4
Error - OCI_STILL_EXECUTE
epoll wait fd:17 to read..
Error - OCI_NODATA
fetch result,rows:1 :cols:1
        1:陈�, 

при установке len_tmp = 3;

Error - OCI_NEED_DATA
len_tmp:3
Error - OCI_NEED_DATA
len_tmp:3
Error - OCI_STILL_EXECUTE
epoll wait fd:17 to read..
Error - OCI_NODATA
fetch result,rows:1 :cols:1
        1:陈浩, 

при установке len_tmp = 5;

Error - OCI_NEED_DATA
len_tmp:5
Error - OCI_NEED_DATA
len_tmp:-5
Error - OCI_STILL_EXECUTE
epoll wait fd:17 to read..
Error - OCI_NODATA
fetch result,row:1 :cols:1
        1:陈��, 

при установке len_tmp = 8;

Error - OCI_NEED_DATA
len_tmp:6
Error - OCI_STILL_EXECUTE
epoll wait fd:17 to read..
Error - OCI_NODATA
fetch result,rows:1 :cols:1
        1:陈浩, 

, когда значение равно ascii char '123456782011', неимеет проблему:

при установке len_tmp = 5;

Error - OCI_NEED_DATA
len_tmp:5
Error - OCI_NEED_DATA
len_tmp:5
Error - OCI_NEED_DATA
len_tmp:2
Error - OCI_STILL_EXECUTE
epoll wait fd:17 to read..
Error - OCI_NODATA
fetch result,rows:1 :cols:1
        1:123456782011, 
...