首页 > 解决方案 > 使用 OCCI c++ 在 Oracle 数据库中批量写入

问题描述

我是 occi 的 Oracle 数据库新手。

我想知道如何在我的 C++ 代码中使用 occi 一次插入多行?

int createStatement(Connection* i_pDBConn)
    {
        int retVal = SUCCESS;

        try
        {
            m_pDBStmt = i_pDBConn->createStatement("INSERT INTO RATED_EVENT_EPM VALUES (:1, :2, :3, :4, :5)");
        }
        catch(SQLException& ex)
        {
            cout<<__FILE__<<":"<<__LINE__<<" "<<ex.getMessage()<<endl;
            retVal = FAILURE;
            return retVal;
        }

        m_pDBStmt->setMaxIterations(1000);
        m_pDBStmt->setMaxParamSize(1, 10);

        return retVal;
    }


    int insertRatedEventDetailInDB(Connection* i_pDBConn, string i_string)
    {
        int retVal = SUCCESS;

        try
        {
            m_pDBStmt->setString(1, i_string);

            if((0 != m_pDBStmt->getCurrentIteration()) && 0 == (m_pDBStmt->getCurrentIteration()%1000))
            {
                m_pDBStmt->executeUpdate();
                i_pDBConn->commit();
            }
            else
            {
                m_pDBStmt->addIteration();
            }
        }
        catch(SQLException& ex)
        {
            cout<<__FILE__<<":"<<__LINE__<<" "<<ex.getMessage()<<endl;
            retVal = FAILURE;
        }

        return retVal;
    }

所以在创建语句单次之后,然后多次调用“insertRatedEventDetailInDB”函数来多次插入行,并且需要在每 1000 次之后执行。

标签: c++oracleocci

解决方案


看起来您正在寻找 executeArrayUpdate():

如果所有数据都由 setDataBuffer() 方法或输出流提供(即,除了 setDataBuffer() 或 getStream() 之外没有调用 setxxx() 方法),则有一种简化的迭代执行方式。

在这种情况下,您不应调用 setMaxIterations() 和 setMaxParamSize()。相反,使用适当大小的数组为每个参数调用 setDataBuffer() 或 getStream() 方法,以便为每次迭代提供数据,然后调用 executeArrayUpdate(int arrayLength) 方法。arrayLength 参数指定每个缓冲区中提供的元素数。本质上,这与将迭代次数设置为 arrayLength 并执行语句相同。

有关更多详细信息,请参阅 Oracle 的文档 - https://docs.oracle.com/cd/E24693_01/appdev.11203/e10764/performance.htm


推荐阅读