在 voltdb 的存储过程中 运行 select 查询后出现错误

Getting an error after running a select query in a stored procedure in voltdb

当我在 Volt DB 存储过程中 运行 查询 select 时,出现 运行 时间错误。当我在 volt DB web studio 中 运行 select 查询时,一切都很好。错误如下:

错误:VOLTDB 错误:意外失败:java.lang.RuntimeException:VoltTableRow 处于无效状态。考虑调用 advanceRow()。在 org.voltdb.VoltTableRow.validateColumnType(VoltTableRow.java:752) 在 org.voltdb.VoltTableRow.getDouble(VoltTableRow.java:384) 在 procedures.testPrcUpdateConstraint.run(testPrcUpdateConstraint.java:93) 在 [=25= .invoke0(本机方法)在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.voltdb.ProcedureRunner.call(ProcedureRunner.java:316) 在 org.voltdb.iv2.ProcedureTask.processInitiateTask(ProcedureTask.java:111) 在 org.voltdb.iv2.MpProcedureTask.run(MpProcedureTask.java:157) 在 org.voltdb.iv2.MpRoSite.run(MpRoSite.java:278) 在 org.voltcore.utils.CoreUtils$6$1.run(CoreUtils.java:644) 在 java.lang.Thread.run(Thread.java:744)

任何关于可能出了什么问题的指示都会非常有帮助。

由此看来,存储过程中的 SQL 没问题,但您试图从 VoltTable 的特定行访问某些值,而不先将其推进到第一行。 VoltTable 有一个指向 "current row" 的内部指针,它最初根本没有指向任何行。

例如,如果您知道 VoltTable 只有一行,您可以执行以下任一操作:

// most efficient, moves the pointer to the next row
table.advanceRow();
String col1 = table.getString(0);

// moves the pointer to an arbitrary row, less efficient for iterating
table.advanceToRow(0);
String col1 = table.getString(0);

// least efficient - makes a new copy of the row
VoltTableRow row = table.fetchRow(0);
String col1 = row.getString(0);

VoltTable 的 Javadoc 页面上有一个示例。这是遍历 VoltTable 的行的最常见习惯用法:

while (table.advanceRow()) {
    System.out.println(table.getLong(7));
}

advanceRow() 和 advanceToRow(int rownumber) 方法来自 VoltTable 扩展的 VoltTableRow。 VoltTable 的 fetchRow(int rownumber) 方法 returns 该行的副本作为新的 VoltTableRow 对象,其中仅包含它已指向的一行数据。