PAYATHON 2026

DolphinDB C++ 插件如何获取实际插入表中的行数?

数据小陈

应改用 tableInsert(destTable, batchTable)。调用正常返回后,通过 ret->getInt() 获取本次插入的行数。tableInsert 支持内存表和 DFS 表,官方文档明确其返回值为 INT 标量。不要从 append! 返回的 dictionary 中推算写入数量。官方 tableInsert 文档

为什么 append! 的返回值不能转成 int?

append! 的返回值不表示插入行数。官方函数文档描述了追加操作及返回对象,并未将返回结果定义为本次写入的计数。官方 append! 文档

在给出的调试结果中,ret 是 dictionary,对它调用 getInt() 会报错:

The object can't be converted to int scalar.

dictionary 第一个成员的 size() 只是该成员的长度。由于没有对应的返回值约定,不能把它当作实际插入行数。现有材料也无法确定 dictionary 中各成员的含义。

C++ 插件应如何修改?

沿用现有插件的调用方式,把函数名改为 tableInsert:

FunctionDefSP insertFunc =
    heap->currentSession()->getFunctionDef("tableInsert");

vector<ConstantSP> insertArgs = {destTable, batchTable};
ConstantSP ret = insertFunc->call(heap, insertArgs);
int insertedRows = ret->getInt();

这里的 destTable 是目标表,batchTable 是待写入的表。对于分区表,传入表形式的数据符合 tableInsert 的参数要求。写入前还应核对列顺序和对应的数据类型。官方参数说明

替换后,每批数据只调用一次写入函数。如果先执行 append!,再执行 tableInsert 获取计数,同一批数据就会被重复提交。

为什么 matchedRowCount 一直返回 0?

matchedRowCount() 统计当前 session 中最后一次 INSERT INTO、DELETE 或 UPDATE 语句影响的行数。直接调用 append! 不在这一约定内;若没有执行过上述 SQL 语句,文档规定返回 0。因此,它不适合用于统计当前插件写入的行数。官方 matchedRowCount 文档

示例中的注释 Execute tableInsert first 与实际代码不一致:代码调用的仍是 appendFunc->call(...),而 appendFunc 指向 append!。

当前官方文档将 matchedRowCount 的首发版本标为 3.00.5,与问题中的 3.0.0.4 存在版本信息不一致。需要核对实际执行插件的服务端版本和所查文档的版本,不能仅凭现有描述确定旧版本的行为。

如何理解实际插入行数?

batchTable 的行数表示提交的行数,不能直接当作写入函数返回的计数。官方文档给出了分区内存表丢弃分区范围外数据的情况,因此提交行数可能大于成功插入行数。对于键值表或索引表,已有键对应的更新也不计入新增行数。官方插入数据说明

还应注意以下几点:

  • 仅在 tableInsert 正常返回后读取计数。调用抛出异常时,应保留错误信息,不能直接记为“插入 0 行”。
  • 通过写入前后的总行数之差计算插入行数时,并发写入或删除会影响结果。
  • 如果必须继续使用 append!,当前材料没有提供可从其 dictionary 返回值中读取可靠计数的依据。

上述代码依据官方返回值约定,并沿用问题中的插件接口写法,未在 DolphinDB 3.0.0.4 环境中实测。可先用少量数据分别验证内存表和 DFS 表的返回值,再接入批量写入逻辑。

备注:内容仅供参考。