【问题标题】:Get rowid in Progress OpenEdge database from 1 to n从 1 到 n 获取正在进行的 OpenEdge 数据库的 rowid
【发布时间】:2017-03-16 01:18:53
【问题描述】:

JDBC 驱动程序不支持 ROW_NUMBER 函数。从表中读取数据时如何获取从 1 到 n 的行 ID?

如果我有一个包含 2 列作为名字和姓氏的表,那么我在 SQL Server 中运行类似“SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rowid, * FROM tableName”的查询。这将为我提供从 1 到 n 的 rowid 以及 ResultSet 中名字和姓氏的内容。

所以我会得到如下结果:

1,菲利克斯,曹

2,杰克,陈

3,尼克,霍

我想对 OpenEdge 数据库进行类似的查询,这样我就可以按照上面的顺序获取 rowid。

【问题讨论】:

  • 不,您似乎并不真正了解 ROWID 是什么。我认为你需要解释你想解决的问题!
  • 好吧,我再问一遍。
  • 您的实际需求似乎与 ROWID 无关,而实际需求是您希望您的结果集按顺序枚举?
  • 对,我想我想知道的只是有一个类似的方法,比如 ROW_NUMBER,它可以为每一行分配从 1 到 n 的 rowid。所以我可以从结果集对象中读取它。
  • 既然您的要求很明确,我已经更新了我的答案。你不会喜欢它,但它就是这样。

标签: java openedge progress-db


【解决方案1】:

不,OpenEdge 数据库中没有 ROW_NUMBER 等价物。

http://knowledgebase.progress.com/articles/Article/Is-ORACLE-row-number-function-supported-in-OpenEdge

关于 ROWID:

暂且不讨论将 ROWID 视为整数是否是一个好主意...(您应该重新阅读链接的 kbase)

无法保证任何特定的 ROWID 值将永远存在,也没有理由让 ROWID 应以零或一或任何其他值开头。

如果您认为 ROWID 和 RECID 是相同的,而 RECID 是由块# 和该块内的位置组成的整数, ROWID 0 永远不会存在,因为存储区域的第一部分是控制数据——那里没有存储任何行。

您可以使用对 ROWID 或 RECID 的猜测(或通过枚举每个可能的值)成功地扫描表,但您必须准备好处理差距。例如,当尝试从损坏的数据库中恢复数据时,这可能很有用。但这不是人们通常会做的事情。

我认为您已经决定 ROWID 是您遇到的问题的解决方案,但真正的问题不是“如何获得 ROWID 0”。如果我不得不猜测,我猜你可能正试图以 N 为单位获得一个结果集。在这种情况下,你应该看看这个:How to mimic SELECT ... LIMIT, OFFSET in OpenEdge SQL?

【讨论】:

  • 对不起,我不应该说 0。你是对的,0 永远不会存在。 ROWID 给出唯一的数字,我知道它增加了 1。我只希望它从 1 开始到 n 而不是一些随机数。感谢您的回答
  • 您不应将 ROWID 视为整数,但除此之外,ROWID 不会增加 1 或任何其他值。 ROWID 的值是不可预测的。最高值和最低值之间会有差距,您的代码必须接受这一事实,否则它将无法工作。
  • 我明白了,我只测试了一些记录,我认为这个数字会增加 1。如果有差距,那么我根本不能在我的应用程序中使用 ROWID。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
相关资源
最近更新 更多