TABLE COLUMN SIZE -- OCIDescribeAny()/OCIAttrGet()

From: Massis Isagholian <massis_at_socal.rr.com>
Date: Fri, 19 Oct 2001 13:14:29 -0700
Message-ID: <ET%z7.1$EQ5.117_at_nnrp2.sbc.net>



I'm having a problem with using OCIDescribeAny() and OCIAttrGet() to determine the SIZE (number of bytes), and NAME of the columns in a table. What's strange is that I have no problems obtaining the TYPE for each column in the table.

The attached sample code demonstrates what I'm doing to access the TYPE, SIZE, and COLUMN NAME information. The comment line "/* THIS FUNCTION CALL DOES NOT WORK */" in the sample code below identifies the specific function which seems to be failing.

At this point I'm out of ideas and I would appreciate your suggestions.

Thanks in advance,
 Massis

/******************* start sample code ********************/

int FetchColInfo(OCIEnv  *phEnv,
     OCISvcCtx *phService,
     OCIError *phErr,
     char  *table_name,
     char  **column_names,
     long  *dbsize,
     short  *dbtype)

{
     char  buf[1000];

    OCIDescribe *phDescribe = 0;

    OCIParam *phTblParam = 0;
    OCIParam *phColList = 0;
    OCIParam *phCol  = 0;

    int numcols = 0, i;

 /* ESTABLISH DESCRIBE HANDLE */     if (OCIHandleAlloc ((dvoid *) phEnv,

                                    (dvoid **) &phDescribe, // create an
Describe handle
                                    OCI_HTYPE_DESCRIBE,
                                    0,
                                    (dvoid **) 0))
    {
            ErrHandler(phEnv, OCI_HTYPE_ENV);
            return OCI_ERROR;

    }

/* GET TABLE DESCRIBE HANDLE */
     if (OCIDescribeAny(phService, phErr, table_name, strlen(table_name), OCI_OTYPE_NAME, 0,

                                       OCI_PTYPE_TABLE, phDescribe))
     {
              ErrHandler((dvoid *) phErr, OCI_HTYPE_ERROR);
              OCIHandleFree((dvoid *) phDescribe, OCI_HTYPE_DESCRIBE);    /*
Free handles */
              return OCI_ERROR;
     }


/* GET TABLE COLUMNS HANDLE */
if (OCIAttrGet(phDescribe, OCI_HTYPE_DESCRIBE, &phTblParam, 0, OCI_ATTR_PARAM, phErr)) { ErrHandler((dvoid *) phErr, OCI_HTYPE_ERROR); OCIHandleFree((dvoid *) phDescribe, OCI_HTYPE_DESCRIBE); /* Free handles */ return OCI_ERROR; }
/* OBTAIN NUMBER OF COLUMNS IN THE TABLE */
if (OCIAttrGet(phTblParam, OCI_DTYPE_PARAM, &numcols, 0, OCI_ATTR_NUM_COLS, phErr)) { ErrHandler((dvoid *) phErr, OCI_HTYPE_ERROR); OCIHandleFree((dvoid *) phDescribe, OCI_HTYPE_DESCRIBE); /* Free handles */ return OCI_ERROR; }
/* GET HANDLE TO THE LIST OF COLUMNS */
if (OCIAttrGet(phTblParam, OCI_DTYPE_PARAM, (dvoid **) &phColList, 0, OCI_ATTR_LIST_COLUMNS, phErr)==OCI_NO_DATA) { ErrHandler((dvoid *) phErr, OCI_HTYPE_ERROR); OCIHandleFree((dvoid *) phDescribe, OCI_HTYPE_DESCRIBE); /* Free handles */ return OCI_ERROR; }
/* VISIT EACH COLUMN NODE AND EXTRACT THE TABLE
COLUMN TYPE, SIZE, AND NAME */ for (i = 1; i <= numcols; i++) { /* get parameter for column i */ if (OCIParamGet(phColList, OCI_DTYPE_PARAM, phErr, (dvoid **) &phCol, i)) { ErrHandler((dvoid *) phErr, OCI_HTYPE_ERROR); OCIHandleFree((dvoid *) phDescribe, OCI_HTYPE_DESCRIBE); /* Free handles */ return OCI_ERROR; } // GET DATA TYPE OF ith COLUMN if (OCIAttrGet(phCol, OCI_DTYPE_PARAM, &dbtype[i-1], 0, OCI_ATTR_DATA_TYPE, phErr)) { ErrHandler((dvoid *) phErr, OCI_HTYPE_ERROR); OCIHandleFree((dvoid *) phDescribe, OCI_HTYPE_DESCRIBE); /* Free handles */ return OCI_ERROR; }

/* THIS FUNCTION CALL DOES NOT WORK */

              // GET LENGHT OF ith COLUMN
              if (OCIAttrGet((dvoid*) phCol, (ub4) OCI_DTYPE_PARAM,
                                      (dvoid*) &dbsize[i-1], (ub4 *) 0,
                                      (ub4) OCI_ATTR_DATA_SIZE, (OCIError *)
phErr))
              {
                       ErrHandler((dvoid *) phErr, OCI_HTYPE_ERROR);
                       OCIHandleFree((dvoid *) phDescribe,
OCI_HTYPE_DESCRIBE);    /* Free handles */
                       return OCI_ERROR;
              }

/* THIS FUNCTION CALL DOES NOT WORK */

              // GET NAME OF ith COLUMN
              if (OCIAttrGet((dvoid*) phCol, (ub4) OCI_DTYPE_PARAM,
                                      (dvoid*) buf, (ub4 *) 0,
                                      (ub4) OCI_ATTR_NAME, (OCIError *)
phErr))
              {
                       ErrHandler((dvoid *) phErr, OCI_HTYPE_ERROR);
                       OCIHandleFree((dvoid *) phDescribe,
OCI_HTYPE_DESCRIBE);    /* Free handles */
                       return OCI_ERROR;
              }

              printf("coltype=%d  colsize=%d colname=%s\n", dbtype[i-1],
dbsize[i-1], buf);

     } // for (i = 1; i <= numcols; i++)

    OCIHandleFree((dvoid *) phDescribe, OCI_HTYPE_DESCRIBE); /* Free handles */

     return 0;
}

/************************ end sample code ****************************/
Received on Fri Oct 19 2001 - 22:14:29 CEST

Original text of this message