如何从进度数据库获取 ROWID
-
01-07-2019 - |
题
我有一个 Progress 数据库,我正在其中执行 ETL。我正在读取的表之一没有唯一键,因此我需要访问 ROWID 才能唯一标识该行。访问正在进行的 ROWID 的语法是什么?
我知道使用 ROWID 进行行标识存在问题,但这就是我现在所拥有的。
解决方案
对我的回答有一个简短的警告——自从我与他们合作以来已经快十年了 进步 所以我的知识可能有点过时了。
检查 进度语言参考 [PDF]似乎显示我记得的两个功能仍然存在: ROWID
和 RECID
. 。这 ROWID
功能比较新,是首选。
在 Progress 4GL 中,您可以像这样使用它:
FIND customer WHERE cust-num = 123.
crowid = ROWID(customer).
或者:
FIND customer WHERE ROWID(customer) = crowid EXCLUSIVE-LOCK.
检查 进度 SQL 参考 [PDF] 显示 ROWID
也可以在 SQL 中作为 Progress 扩展使用。你会像这样使用它:
SELECT ROWID, FirstName, LastName FROM customer WHERE cust-num = 123
编辑: 根据 Stefan 的反馈进行编辑。
其他提示
根据您的情况和应用程序的行为,这可能重要也可能无关紧要,但您应该意识到 ROWID 和 RECID 会被重用并且它们可能会发生变化。
1)如果一条记录被删除,它的ROWID最终将被重用。
2) 如果通过转储和加载或将表移动到新的存储区域来重新组织表,则 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,具体取决于您想要重新持久性和唯一性的保证)
不隶属于 StackOverflow