OCI在不知道表结构的情况下获取数据

时间:2016-04-16 11:37:13

标签: c++ c oracle oci

我第一次和OCI一起工作所以这可能是一个基本的问题....我来自MySql的话....使用VS2012和C ++。

我希望做一个简单的SELECT语句,其中包含WHERE和LIMIT子句的一些变体。 SQL查询是从C ++编写的处理器动态构建的,该语句可以从该模块中准备好。所以我可能有类似的东西:

SELECT * FROM MYTABLE3;

SELECT F1, F2, F3 FROM MYTABLE1;甚至

SELECT F1, F3, F4 FROM MYTABLE2 WHERE ID > 10;

这里没什么大不了的。

我的问题是我不知道提前表格格式,因此在执行语句和获取表格结构之前,我无法将变量绑定到它。在MySql中这很容易,因为我执行语句并得到了resultSet。从resultSet我可以检查检索的列数,每列的名称,数据格式和大小。在读取该数据后,我构建了一个包含表结构及其数据的动态矩阵,这是我的最终目标。有点像:

   sql::ResultSetMetaData *resultMeta = resultSet->getMetaData();

    while (resultSet->next())
    {
         for (unsigned int i = 1; i <= resultMeta->getColumnCount(); i++) 
         {
             std::string label = resultMeta->getColumnLabel(i);
             std::string type = resultMeta->getColumnTypeName(i);
             // ... Get the resultset attributes and data
         }

         retData.push_back(data); 
     }

从我在Oracle中看到的,我需要在发出执行/获取操作之前绑定将要返回的变量。在我的情况下,我不能这样做,因为我事先不知道表结构......

我很确定甲骨文能做到这一点,我不知道该怎么做。我读过Oracle Docs并没有找到对它的引用....

非常感谢帮助和代码示例。我现在坚持了2天......感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

请在语句句柄(stmhp)上尝试以下操作。这将为您提供oracle语句的列数。

err = OCIAttrGet((dvoid *)stmhp,(ub4)OCI_HTYPE_STMT,(dvoid *)                   &amp; parmcnt,(ub4 *)0,(ub4)OCI_ATTR_PARAM_COUNT,errhp);

请检查此链接,这将帮助您找出结果集中每列的数据类型。

Retrieving data type information for columns in an Oracle OCCI ResultSet