我只是想听听关于 ROWID 类型用作任何函数或过程的输入参数的不同意见。
我通常使用并看到用作输入参数的主键,但是使用 ROWID 作为输入参数有什么缺点吗?我认为这很简单,如果在 WHERE 子句中使用,选择非常快。
例如:
FUNCTION get_row(p_rowid IN ROWID) RETURN TABLE%ROWTYPE IS...
从概念指南:
物理 rowid 提供对给定表的行的最快访问。它们包含一行的物理地址(一直到特定块),并允许您在单个块访问中检索该行。Oracle保证只要行存在,它的rowid就不会改变。
ROWID 的主要缺点是,虽然它通常是稳定的,但在某些情况下可能会发生变化:
ALTER TABLE MOVE
...)主键在逻辑上标识一行,即使在删除+插入之后,您也总能找到正确的行。ROWID 以物理方式标识行,并且不像主键那样持久。
您可以在单个 SQL 语句中安全地使用 ROWID,因为 Oracle 将保证结果是一致的,例如删除表中的重复项。为了安全起见,我建议您仅在锁定行时使用 ROWID accross 语句(SELECT ... FOR UPDATE)。
从性能的角度来看,主键访问要贵一些,但通常只有在执行大量单行访问时才会注意到这一点。但是,如果性能很关键,那么在这种情况下,使用集合处理通常可以获得比使用 rowid 的单行处理更大的好处。特别是,如果数据库和应用程序之间有很多往返,那么与往返成本相比,行访问的成本可能可以忽略不计。