如何从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将更改。