代码之家  ›  专栏  ›  技术社区  ›  pOrinG

试图在Oracle中计算rowid的最大长度

  •  1
  • pOrinG  · 技术社区  · 6 年前

    按照我的设计,我想把rowid取出来

    select rowid r from table_name;
    

    变为C变量。我想知道rowid字符的最大大小/长度是多少。

    目前,在我的数据库中最大的一个表中,rowid的最大长度为18,它的整个表中的最大长度为18。

    事先谢谢。

    编辑: 目前,下面的代码块被迭代并用于多个表,因此为了使代码更灵活,而不需要在我们使用的rowid查询中定义每个表的pk。

    select rowid from table_name ... where ....;
    
    delete from table_name where rowid = selectedrowid;
    

    我认为,由于rowid是在不为将来存储的情况下被挑选和使用的,所以在这个特定的场景中使用是安全的。

    请参考以下答案: Is it safe to use ROWID to locate a Row/Record in Oracle?

    我会说不。如果应用程序临时存储rowid,这是安全的(比如生成一个可选择项目的列表,每个项目都用rowid标识,但列表通常是重新生成的,而不是存储的)。但如果以任何持久的方式使用rowid,就不安全。

    2 回复  |  直到 6 年前
        1
  •  2
  •   wolφi    6 年前

    在给定的Oracle版本中,物理rowid的大小是固定的,它不依赖于表中的行数。它由数据文件的编号、此文件中块的编号以及此块中的行的编号组成。因此,它在整个数据库中是唯一的,允许直接访问块和行,而无需进一步查找。

    随着IT世界中的事物不断增长,可以安全地假设未来格式将发生变化。

    除了卷之外,还有结构上的变化,如可传输表空间的出现,这使得有必要将对象编号(=表/分区/子分区的内部编号)存储在rowid中。

    或者是索引组织表的出现(由@ibre5041提到),它看起来像一个表,但实际上只是一个没有这种物理地址的索引(因为索引中的事物总是在移动)。这使得有必要引入可以存储物理和基于索引的rowids。

    请注意,rowid可以更改,例如,如果行从一个表分区移动到另一个表分区,或者如果对表进行碎片整理以填补许多删除操作留下的漏洞。

        2
  •  1
  •   Wernfried Domscheit    6 年前

    根据 documentation rowid的长度为10字节:

    行件的行ID

    堆组织表中的每一行都有一个对此表唯一的rowid 与行块的物理地址相对应的。用于桌子 集群,同一数据块中不同表中的行可以 拥有相同的rowid。

    Oracle还记录了(当前)格式,请参见, Rowid Format

    通常,如果受影响的行是 锁定的 !

    因此,您的陈述如下:

    CURSOR ... IS
    select rowid from table_name ... where .... FOR UPDATE;
    
    delete from table_name where rowid = selectedrowid;
    

    看见 SELECT FOR UPDATE and FOR UPDATE Cursors

    甲骨文甚至提供了一条捷径。而不是 where rowid = selectedrowid 你可以用 WHERE CURRENT OF ...