2010-07-26 5 views
1

OCCI (예 : select * from ALL_USERS)를 통해 간단한 쿼리를 보낸 후 열의 데이터 유형을 알아야 할 필요가 있습니다. ResultSet :: getColumnListMetaData() 메서드를 사용하여 성공하지 못했습니다.
질문 :
1. 어떻게 앞에서 설명한 메서드와 MetaData 클래스를 사용하여 데이터 형식을 가져올 수 있습니까?
2. 오라클이 이미 제공 한 문서보다 더 좋은 문서가 있습니까?Oracle OCCI ResultSet의 열에 대한 데이터 유형 정보 검색

+0

다음과 같이 표시됩니다. MetaData :: getString (occi :: MetaData :: ATTR_TYPECODE); 항상이 설명과 함께 SQLException을받습니다. ** ORA-31124 : 잘못된 속성이 전달되었습니다 ** – Coredumped

답변

2

저는이 오래된 코드를 사용하고 있습니다. 정확히 원하는대로 할 것입니다. OCCI가 아닌 OCI를 사용하지만 어쩌면 도움이됩니다.

/* 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 랜드에서) 정수로오고 있다고 생각했습니다. getInt()를 사용하여 getString (occi :: MetaData :: ATTR_DATA_TYPE)에 적어도 오류 메시지가 나타나지는 않지만 적절한 Oracle 데이터 유형에 숫자 코드를 일치시키는 방법을 모르겠다. 아마도 getSQLTypes에 대답? 도움을 많이 주셔서 감사합니다 – Coredumped

+0

@Coredumped 기꺼이 도와 드리겠습니다. – Gianni

+0

덕분에 그 스 니펫으로 나를 도왔습니다. – Coredumped

0
당신이 방법을 사용할 수 있습니다

:

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

을 당신이 찾을 수있는 가능한 형태의 열거 형 정수로 반환 된 값을 비교 occiCommon.h :

enum Type { OCCI_SQLT_CHR=SQLT_CHR, OCCI_SQLT_NUM=SQLT_NUM ... } 
관련 문제