2010-07-26 49 views
1

通過OCCI發送簡單查詢(例如:select * from ALL_USERS)我需要知道列的數據類型,目前我已經用ResultSet :: getColumnListMetaData()方法沒有成功。
問題:
1.如何使用上述方法和MetaData類獲取數據類型?
2.有沒有比oracle已經提供的更好的文檔?檢索Oracle OCCI結果集中的列的數據類型信息

+0

類似於: MetaData :: getString(occi :: MetaData :: ATTR_TYPECODE); 我總是最終收到一個SQLException和這個描述:** ORA-31124:傳遞的非法屬性** – Coredumped 2010-07-26 19:20:26

回答

2

我已經得到了這個舊代碼,我想它確實是你想要的。它使用OCI,而不是OCCI,但也許它有幫助。

/* Get the number of columns in the query */ 
ub4 colCount = 0; 
oraCheckErr(m_err, OCIAttrGet((dvoid *)_stmt, OCI_HTYPE_STMT, (dvoid *)&colCount, 
        0, OCI_ATTR_PARAM_COUNT, m_err)); 

ub2 oraType = 0; 
OCIParam *col = 0; 

ub4 nameLen, colWidth, charSemantics; 
text *name; 

for (ub4 i = 1; i <= colCount; i++) 
{ 
    /* get parameter for column i */ 
    oraCheckErr(m_err, OCIParamGet((dvoid *)_stmt, OCI_HTYPE_STMT, m_err, (dvoid**)&col, i)); 

    /* get data-type of column i */ 
    oraType = 0; 
    oraCheckErr(m_err, OCIAttrGet((dvoid *)col, OCI_DTYPE_PARAM, 
      (dvoid *)&oraType, 0, OCI_ATTR_DATA_TYPE, m_err)); 

    /* Retrieve the column name attribute */ 
    nameLen = 0; 
    oraCheckErr(m_err, OCIAttrGet((dvoid*)col, OCI_DTYPE_PARAM, 
      (dvoid**) &name, &nameLen, OCI_ATTR_NAME, m_err)); 

    /* Retrieve the length semantics for the column */ 
    charSemantics = 0; 
    oraCheckErr(m_err, OCIAttrGet((dvoid*)col, OCI_DTYPE_PARAM, 
      (dvoid*) &charSemantics,0, OCI_ATTR_CHAR_USED, m_err)); 

    colWidth = 0; 
    if (charSemantics) 
     /* Retrieve the column width in characters */ 
     oraCheckErr(m_err, OCIAttrGet((dvoid*)col, OCI_DTYPE_PARAM, 
       (dvoid*) &colWidth, 0, OCI_ATTR_CHAR_SIZE, m_err)); 
    else 
     /* Retrieve the column width in bytes */ 
     oraCheckErr(m_err, OCIAttrGet((dvoid*)col, OCI_DTYPE_PARAM, 
       (dvoid*) &colWidth,0, OCI_ATTR_DATA_SIZE, m_err)); 

    _elements.output.push_back(SQLElement(String(reinterpret_cast<char*>(name), nameLen), getSQLTypes(oraType), i, colWidth)); 
} 

OCIHandleFree ((dvoid*) _stmt, OCI_HTYPE_STMT); 

編輯:按ypour要求:

SQLTypes getSQLTypes(ub2 _oracleType) 
{ 
switch(_oracleType) 
{ 
    case SQLT_INT: 
     return stInt; 
    case SQLT_FLT: 
    case SQLT_BDOUBLE: 
     return stDouble; 
    case SQLT_BFLOAT: 
     return stFloat; 
    case SQLT_ODT: 
     return stDate; 

    case SQLT_DATE: 
    case SQLT_TIMESTAMP: 
    case SQLT_TIMESTAMP_TZ: 
    case SQLT_TIMESTAMP_LTZ: 
     return stTimeStamp; 

    case SQLT_CHR: 
    case SQLT_NUM: 
    case SQLT_STR: 
    case SQLT_VCS: 
    default: 
     return stText; 
} 
} 
+0

我認爲數據類型是以字符串形式出現的,而不是以整數形式出現(在OCCI域中),所以不是getString(occi :: MetaData :: ATTR_DATA_TYPE)通過使用getInt()至少不會得到錯誤消息,但是,我不知道如何將數字代碼與適當的oracle數據類型相匹配,也許你的getSQLTypes有答案? 非常感謝您的幫助 – Coredumped 2010-07-26 20:07:07

+0

@Coredumped很高興我能幫上忙。 – Gianni 2010-07-26 20:32:15

+0

非常感謝你真的幫我解決了這個問題 – Coredumped 2010-07-27 20:59:48

0

您可以使用方法:

MetaData::getInt(occi::MetaData::ATTR_DATA_TYPE); 

和可能的類型,你可以找到的枚舉與常量比較返回的值在occiCommon.h中:

enum Type { OCCI_SQLT_CHR=SQLT_CHR, OCCI_SQLT_NUM=SQLT_NUM ... } 
相關問題