试图找出Oracle中Rowid的最大长度

时间:2018-05-29 13:09:22

标签: oracle oracle11g

根据我的设计,我想在

中获取rowid
select rowid r from table_name;

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

目前在我的数据库中最大的一个表格中,我们的最大长度为18,其中18位为rowid。

提前致谢。

编辑: 目前,下面的代码块被迭代并用于多个表,因此为了使代码灵活,而不需要在我们使用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 个答案:

答案 0 :(得分:2)

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

随着IT世界的不断发展,可以安全地假设格式将来会发生变化。

除了卷之外,还有结构更改,例如可传输表空间的出现,这使得必须在ROWID中存储对象编号(=表/分区/子部分的内部编号)。

或索引组织表的出现(由@ ibre5041提及),看起来像一张表,但实际上只是一个没有这样一个物理地址的索引(因为事情在索引中不断变化)。这使得有必要引入可以存储物理和基于索引的ROWID的UROWID。

请注意,ROWID可以更改,例如,如果行从一个表分区移动到另一个表分区,或者是否对表进行了碎片整理以填充许多DELETE剩余的孔。

答案 1 :(得分:1)

根据documentation ROWID的长度为10 Byte:

  

行号的行数

     

rowid实际上是一行的10字节物理地址。

     

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

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

一般情况下,如果受影响的行已锁定,您可以在应用中使用ROWID!

因此,您的陈述可能如下所示:

CURSOR ... IS
select rowid from table_name ... where .... FOR UPDATE;

delete from table_name where rowid = selectedrowid;

请参阅SELECT FOR UPDATE and FOR UPDATE Cursors

Oracle甚至提供了一种快捷方式。您可以使用where rowid = selectedrowid

而不是WHERE CURRENT OF ...