我有一个正在执行 ETL 的 Progress 数据库。我正在读取的表之一没有唯一键,因此我需要访问 ROWID 才能唯一标识该行。访问正在进行的 ROWID 的语法是什么?
我知道使用 ROWID 进行行识别存在问题,但这就是我现在所拥有的。
我有一个正在执行 ETL 的 Progress 数据库。我正在读取的表之一没有唯一键,因此我需要访问 ROWID 才能唯一标识该行。访问正在进行的 ROWID 的语法是什么?
我知道使用 ROWID 进行行识别存在问题,但这就是我现在所拥有的。
对我的回答有一个简短的警告-自从我与Progress合作以来已经将近 10 年了,所以我的知识可能已经过时了。
检查进度语言参考[PDF] 似乎显示了我记得的两个功能仍然存在:ROWID
和RECID
. 该ROWID
功能较新,是首选。
在 Progress 4GL 中,你会像这样使用它:
FIND customer WHERE cust-num = 123.
crowid = ROWID(customer).
或者:
FIND customer WHERE ROWID(customer) = crowid EXCLUSIVE-LOCK.
检查Progress SQL Reference [PDF] 显示ROWID
在 SQL 中也可以作为 Progress 扩展。你会像这样使用它:
SELECT ROWID, FirstName, LastName FROM customer WHERE cust-num = 123
编辑:根据 Stefan 的反馈进行编辑。
根据您的情况和应用程序的行为,这可能会或可能不重要,但您应该知道 ROWID 和 RECID 被重用并且它们可能会改变。
1)如果一条记录被删除,它的ROWID最终将被重用。
2) 如果表通过转储和加载或 tablemove 重新组织到新的存储区域,则 ROWID 将更改。
只是为戴夫韦伯的答案添加一点。我曾在 select 语句中尝试过 ROWID,但出现语法错误。ROWID 仅在您指定要选择的其余列时才有效,您不能使用 *.
这不起作用:
SELECT ROWID, * FROM customer WHERE cust-num = 123
这确实有效:
SELECT ROWID, FirstName, LastName FROM customer WHERE cust-num = 123
一个快速的谷歌搜索出现了这个: http ://bytes.com/forum/thread174440.html
通过 greg@turnstep.com 阅读底部的消息(您需要 oid 或 ctid,具体取决于您想要重新持久性和唯一性的保证)