如何从Progress数据库获取ROWID

4

我有一个Progress数据库,正在进行ETL。 我要读取的其中一张表没有唯一键,因此我需要访问ROWID来唯一标识行。 在Progress中访问ROWID的语法是什么?

我知道使用ROWID进行行标识存在问题,但这是我现在拥有的唯一标识。

4个回答

8

我在回答中需要说明一件事情——距离我上次使用Progress已经接近10年了,所以我的知识可能已经过时了。

查看Progress语言参考[PDF]似乎显示我记得的两个函数仍然存在:ROWIDRECID。其中ROWID函数是较新的,更受推荐。

在Progress 4GL中,您可以像这样使用它:

FIND customer WHERE cust-num = 123.
crowid = ROWID(customer).

或者:

FIND customer WHERE ROWID(customer) = crowid EXCLUSIVE-LOCK.

检查Progress SQL参考 [PDF],可以看到ROWID也是Progress扩展中SQL中可用的。像这样使用它:
SELECT ROWID, FirstName, LastName FROM customer WHERE cust-num = 123

编辑:根据Stefan的反馈进行了编辑。


在前两个例子中,你应该在最前面加上一个NO-ERROR。在第一个例子中在为ROWID赋值之前添加IF AVAIL customer THEN。或者,你可以将赋值语句放在FOR FIRST CUSTOMER NO-LOCK WHERE...内部。这些仅是避免出现错误消息的替代方法,如果没有匹配的客户就会出现错误。 - Jason Down

5

根据您的情况和应用程序的行为,这可能很重要,也可能不重要,但您应该知道ROWIDs和RECIDs会被重复使用并且可能会发生变化。

1)如果记录被删除,它的ROWID最终将被重复使用。

2)如果表通过转储和加载或表移动到新存储区域进行重新组织,则ROWIDs将更改。


3
仅仅是想为Dave Webb的答案添加一些内容。我尝试在select语句中使用ROWID,但是出现了语法错误。只有在指定其余要选择的列时,ROWID才有效,不能使用*。
这样是不起作用的:
SELECT ROWID, * FROM customer WHERE cust-num = 123

这是有效的:

SELECT ROWID, FirstName, LastName FROM customer WHERE cust-num = 123

2
很高兴听到这个消息。当我使用Progress时,一切都是关于4GL的,SQL支持还比较新,所以我从未使用SQL查询过Progess数据库。尽管如此,据我所记,它是一个拥有良好架构的优秀数据库,但很遗憾它很少被使用。 - David Webb
一旦您指定了列名,就必须在表名前加上*。所以,在这个例子中,SELECT RowID, "cust-num".* FROM ...将起作用。 - David J

-2
一个快速的谷歌搜索可以找到这个链接: http://bytes.com/forum/thread174440.html 请阅读greg@turnstep.com在底部留言(根据您想要的持久性和唯一性保证,您需要oid或ctid)。

我有一个Progress数据库,而不是PostgreSQL数据库。 - Stefan Moser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接