如何从Progress数据库获取ROWID
时间:2020-03-06 14:23:46 来源:igfitidea点击:
我有一个要从中执行ETL的Progress数据库。我正在读取的表之一上没有唯一键,因此我需要访问ROWID才能唯一标识行。访问进行中的ROWID的语法是什么?
我知道使用ROWID进行行标识存在一些问题,但这就是我现在所拥有的全部。
解决方案
一个快速的谷歌搜索结果:
http://bytes.com/forum/thread174440.html
通过[email protected]向底部阅读消息(我们想要oid还是ctid,这取决于要确保持久性和唯一性的保证)
自从我与Progress合作以来已有近10年的时间,我很快就做出了回答,所以我的知识可能已经过时了。
查看进度语言参考[PDF]似乎表明我记得还有两个功能:" ROWID"和" RECID"。 ROWID函数是较新的,是首选。
在进行中的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的反馈进行编辑。
只是为了增加Dave Webb的答案。我曾在select语句中尝试过ROWID,但遇到语法错误。仅当我们指定要选择的其余列时,ROWID才有效,而不能使用*。
这不起作用:
SELECT ROWID, * FROM customer WHERE cust-num = 123
这确实有效:
SELECT ROWID, FirstName, LastName FROM customer WHERE cust-num = 123
根据情况和应用程序的行为,这可能会或者可能不会很重要,但是我们应该知道ROWID和RECID已被重用并且可能会更改。
1)如果删除一条记录,则其ROWID最终将被重用。
2)如果通过转储和装入或者将表移动到新存储区来重组表,则ROWID将更改。