2

rownumまたはランキング分析関数を使用したOracleでのページングについて多くの回答を見てきました。ただし、特にこれらのページ結果にロックを適用したいと思います。問題は、Oracleのほとんどのページングハックはインラインビューを使用するため、適用for updateは違法であるということです。

では、できれば同じSQLステートメントで両方を実行する方法はありますか?

私たちが今試していることの例...

select * 
from (
    select ...
    from t
    where ...
    order by ...
)
where rownum <= ? 
for update

私たちが得るエラーはORA-02014:, cannot select FOR UPDATE from view with DISTINCT, GROUP BY, etc.

4

1 に答える 1

5

これがあなたができることの例です

SQL> create table t as select object_id, owner, object_name, created from all_objects where rownum <= 100;

Table created.

SQL> 
SQL> select *
  2    from t
  3   where rowid in
  4         (select rid
  5            from (select rowid rid, row_number() over(order by object_id) rn from t)
  6           where rn between 11 and 20)
  7     for update;

OBJECT_ID OWNER OBJECT_NAM CREATED
--------- ----- ---------- ---------
       20 SYS   ICOL$      06-MAR-11
       15 SYS   UNDO$      06-MAR-11
       17 SYS   FILE$      06-MAR-11
       13 SYS   UET$       06-MAR-11
       19 SYS   IND$       06-MAR-11
       14 SYS   SEG$       06-MAR-11
       21 SYS   COL$       06-MAR-11
       16 SYS   TS$        06-MAR-11
       12 SYS   FET$       06-MAR-11
       18 SYS   OBJ$       06-MAR-11

10 rows selected.
于 2012-08-22T05:43:17.627 に答える