检索Oracle OCCI ResultSet中的列的数据类型信息 [英] Retrieving data type information for columns in an Oracle OCCI ResultSet

查看:902
本文介绍了检索Oracle OCCI ResultSet中的列的数据类型信息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在通过OCCI发送一个简单的查询(例如:select * from ALL_USERS)后,我需要知道列的数据类型,因为我一直在使用 ResultSet :: getColumnListMetaData )方法无效。

问题:

1.如何使用上述方法和MetaData类获取数据类型?

2.有没有比oracle已经提供的更好的文档?

解决方案

周围,​​我想它确实是你想要的。它使用OCI,而不是OCCI,但也许有帮助。

  / *获取查询中的列数* / 
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 ++)
{
/ *列i的参数* /
oraCheckErr(m_err,OCIParamGet ((dvoid *)_stmt,OCI_HTYPE_STMT,m_err,(dvoid **)& col,i));

/ *获取列i的数据类型* /
oraType = 0;
oraCheckErr(m_err,OCIAttrGet((dvoid *)col,OCI_DTYPE_PARAM,
(dvoid *)& oraType,0,OCI_ATTR_DATA_TYPE,m_err)

/ *检索列名属性* /
nameLen = 0;
oraCheckErr(m_err,OCIAttrGet((dvoid *)col,OCI_DTYPE_PARAM,
(dvoid **)& name,& nameLen,OCI_ATTR_NAME,m_err));

/ *检索列的长度语义* /
charSemantics = 0;
oraCheckErr(m_err,OCIAttrGet((dvoid *)col,OCI_DTYPE_PARAM,
(dvoid *)& charSemantics,0,OCI_ATTR_CHAR_USED,m_err)

colWidth = 0;
if(charSemantics)
/ *以字符形式检索列宽度* /
oraCheckErr(m_err,OCIAttrGet((dvoid *)col,OCI_DTYPE_PARAM,
(dvoid *)& colWidth,0,OCI_ATTR_CHAR_SIZE,m_err));
else
/ *以字节为单位检索列宽度* /
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;
}
}


After sending a simple query via OCCI (example: select * from ALL_USERS) I'm in the need to know the datatype for the column, for the moment I've been playing with the ResultSet::getColumnListMetaData() method without success.
Questions:
1. How can I get the datatype by using the aforementioned method and the MetaData class?
2. Is there any better documentation out there than the one already provided by oracle?

解决方案

I've got this old code laying around, I guess it does exactly what you want. Its using OCI, not OCCI, but maybe it helps.

/* 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 );

EDIT: As per ypour request:

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;
}
}

这篇关于检索Oracle OCCI ResultSet中的列的数据类型信息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆