当我在 Volt DB 存储过程中运行选择查询时,出现运行时错误。当我在 volt DB Web Studio 中运行选择查询时,一切都很好。错误如下:
错误:VOLTDB 错误:意外失败:java.lang.RuntimeException:VoltTableRow 处于无效状态。考虑调用 advanceRow()。在 org.voltdb.VoltTableRow.validateColumnType(VoltTableRow.java:752) 在 org.voltdb.VoltTableRow.getDouble(VoltTableRow.java:384) 在 procedure.testPrcUpdateConstraint.run(testPrcUpdateConstraint.java:93) 在 sun.reflect.NativeMethodAccessorImpl。在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)处调用0( native 方法)在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 有一个指向“当前行”的内部指针,该指针最初根本不指向任何行。
例如,如果您知道 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);
Javadoc 页面上有一个关于 VoltTable 的示例。这是迭代 VoltTable 行的最常见习惯用法:
while (table.advanceRow()) {
System.out.println(table.getLong(7));
}
advanceRow() 和 advanceToRow(int rownumber) 方法来自 VoltTableRow ,VoltTable 扩展。 VoltTable 的 fetchRow(int rownumber) 方法返回该行的副本作为新的 VoltTableRow 对象,该对象仅包含它已指向的一行数据。
关于java - 在 voltdb 的存储过程中运行选择查询后出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27927836/