【发布时间】:2008-09-18 22:04:30
【问题描述】:
我有一个正在执行 ETL 的 Progress 数据库。我正在读取的表之一没有唯一键,因此我需要访问 ROWID 才能唯一标识该行。访问正在进行的 ROWID 的语法是什么?
我了解使用 ROWID 进行行识别存在问题,但我现在只有这些。
【问题讨论】:
标签: database progress-4gl progress-db
我有一个正在执行 ETL 的 Progress 数据库。我正在读取的表之一没有唯一键,因此我需要访问 ROWID 才能唯一标识该行。访问正在进行的 ROWID 的语法是什么?
我了解使用 ROWID 进行行识别存在问题,但我现在只有这些。
【问题讨论】:
标签: database progress-4gl progress-db
对我的回答有一个简短的警告 - 我与 Progress 合作已经快 10 年了,所以我的知识可能已经过时了。
检查Progress Language Reference [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 将更改。
【讨论】:
只是为 Dave Webb 的答案添加一点内容。我曾在 select 语句中尝试过 ROWID,但出现语法错误。 ROWID 仅在您指定要选择的其余列时才有效,您不能使用 *。
这不起作用:
SELECT ROWID, * FROM customer WHERE cust-num = 123
这确实有效:
SELECT ROWID, FirstName, LastName FROM customer WHERE cust-num = 123
【讨论】:
SELECT RowID, "cust-num".* FROM ... 可以工作
一个快速的谷歌搜索出现了这个: http://bytes.com/forum/thread174440.html
阅读 greg@turnstep.com 底部的消息(您需要 oid 或 ctid,具体取决于您想要的持久性和唯一性保证)
【讨论】: