代码之家  ›  专栏  ›  技术社区  ›  Stefan Moser

如何从进度数据库中获取rowid

  •  4
  • Stefan Moser  · 技术社区  · 16 年前

    我有一个正在执行ETL的进度数据库。我正在读取的其中一个表上没有唯一的键,因此我需要访问rowid才能唯一地标识该行。访问正在进行的rowid的语法是什么?

    我知道使用rowid进行行标识有问题,但这是我目前所拥有的全部功能。

    4 回复  |  直到 16 年前
        1
  •  8
  •   David Webb    16 年前

    我的回答很快就要注意了——我已经有近10年没有和他一起工作了。 Progress 所以我的知识可能有点过时了。

    检查 Progress Language Reference [pdf]似乎显示了我记忆中的两个功能: ROWID RECID . 这个 罗维德 功能更新,首选。

    在进行中的4GL,您可以这样使用它:

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

    或:

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

    检查 Progress SQL Reference [PDF]展示 罗维德 在SQL中也可用作进度扩展。你可以这样使用它:

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

    编辑: 根据Stefan的反馈编辑。

        2
  •  5
  •   Tom Bascom    15 年前

    根据您的情况和应用程序的行为,这可能重要,也可能不重要,但您应该知道rowids和recid是重用的,它们可能会更改。

    1)如果一条记录被删除,它的rowid最终将被重用。

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

        3
  •  2
  •   Stefan Moser    16 年前

    只是在戴夫·韦伯的回答中加一点。我在select语句中尝试了rowid,但得到了一个语法错误。仅当指定要选择的其余列时,rowid才起作用,不能使用*。

    这不起作用:

    SELECT ROWID, * FROM customer WHERE cust-num = 123
    

    这是可行的:

    SELECT ROWID, FirstName, LastName FROM customer WHERE cust-num = 123
    
        4
  •  -1
  •   SquareCog    16 年前

    一个快速的谷歌搜索会发现: http://bytes.com/forum/thread174440.html

    请阅读greg@turnstep.com下面的信息(您需要OID或CTID,这取决于您想要持久性和唯一性的保证)。