2

我正在运行看起来像这样的查询:

INSERT INTO foo (...) VALUES (...) RETURNING ROWID INTO :bind_var

SELECT ... FROM foo WHERE ROWID = :bind_var

本质上,我插入一行并获取它的 ROWID,然后对该 ROWID 进行选择以从该记录中取回数据。不过,偶尔会找不到 ROWID。

忽略可能有更好的方法来做我想做的事情这一事实,假设没有其他人使用数据库,ROWID 是否有可能快速更改?

更新 涉及到一个触发器。这是它的 DDL 语句:

CREATE OR REPLACE TRIGGER "LOG_ELIG_DEMOGRAPHICS_TRG" 
before insert on log_elig_demographics
for each row
begin
select log_elig_demographics_seq.nextval into :new.log_idn from dual;
end;

本质上,它只是一个触发器,用于帮助我们模拟 IDENTITY/AUTO INCREMENT 字段。这个触发器有问题吗?

4

7 回答 7

3

A ROWID won't change unless:

  • you move the table (ALTER TABLE t MOVE), from one tablespace to another for example
  • the row switches from one partition to another (partitioned table with ENABLE ROW MOVEMENT)
  • you update the primary key of an INDEX ORGANIZED table.

When a row moves from one block to another in a standard (HEAP) table, because it grows so large it can't fit into its original block for example, it will be migrated. Oracle will leave a pointer to the new block and move the row. The row will keep its original ROWID.

ROWIDs can be relied upon, they are used in replication to refresh materialized views for example.

于 2009-09-29T19:39:32.260 回答
2

我同意沃尔特的观点。

代替

INSERT INTO foo (...) VALUES (...) RETURNING ROWID INTO :bind_var
SELECT ... FROM foo WHERE ROWID = :bind_var


...为什么不做以下事情?

选择primaryKey_seq.nextVal
INTO bind_var
从双;

INSERT INTO foo (primaryKeyColumn,...)
值(绑定变量,...);

SELECT ... FROM foo WHERE primaryKeyColumn = bind_var;
于 2009-09-30T04:35:38.140 回答
2

您的 INSERT 应该是:

INSERT INTO foo 
  (primary_key,
   ...) 
VALUES 
  (log_elig_demographics_seq.nextval,
   ...) 
RETURNING primary_key INTO :bind_var

不需要触发器。

于 2009-09-29T18:53:29.593 回答
2

其他一些事情可能正在发生。首先,INSERT 可能失败。你在检查错误/异常吗?如果不是,则变量中的值可能是垃圾。

其次,您可以插入可以选择的内容。虚拟专用数据库/行级安全可能负责。

第三,如果您在插入和选择之间提交,延迟约束可能会强制回滚插入。

第四,也许你正在回滚。

于 2009-09-30T09:39:26.540 回答
1

如何声明绑定变量?在 SQLPlus 中,您不能使用 ROWID 类型,因此需要进行类型转换。我想知道这是否有可能在某些时候改变了 ROWID 值。

于 2009-09-30T17:24:39.203 回答
1

表上是否有可能反转插入的触发器?

于 2009-09-29T18:30:21.123 回答
1

根据我的经验,发生此类错误的最可能原因是介于两者之间的某个地方发生了回滚。或者,如果有一个提交,另一个用户可能已经删除了该记录。

于 2009-09-29T18:45:00.063 回答