【问题标题】:Getting an error after running a select query in a stored procedure in voltdb在 voltdb 的存储过程中运行选择查询后出现错误
【发布时间】:2015-01-13 17:20:23
【问题描述】:

在 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) 在程序.testPrcUpdateConstraint.run(testPrcUpdateConstraint.java:93) 在 sun.reflect.NativeMethodAccessorImpl。在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java: 43) 的 invoke0(Native Method) 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章)

任何关于可能出错的指针都会非常有帮助。

【问题讨论】:

    标签: java stored-procedures runtime-error voltdb


    【解决方案1】:

    由此看来,存储过程中的 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);
    

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

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

    AdvanceRow() 和 AdvanceToRow(int rownumber) 方法来自 VoltTableRow,它是 VoltTable 的扩展。 VoltTable 的 fetchRow(int rownumber) 方法将该行的副本作为新的 VoltTableRow 对象返回,该对象仅包含它已经指向的一行数据。

    【讨论】:

    • 第一个选项,advanceRow() 仍然是最快的方式,但我要补充一点,既然写了这个,VoltDB 对 AdvanceToRow(n) 做了一些优化。如果您正在迭代递增的行号,那么 AdvanceToRow(n) 将几乎与 AdvanceRow() 一样高效,因为它缓存了前一个行号和指针,并尽可能使用它们作为起点。
    猜你喜欢
    • 2018-10-12
    • 2013-03-12
    • 1970-01-01
    • 2019-04-08
    • 2019-06-18
    • 2013-01-08
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多