oracle - Oracle 中的分页和锁定

标签 oracle

我已经看到很多关于 Oracle 中使用 rownum 或排名分析函数进行分页的答案。但是,我特别想对这些分页结果应用锁定。问题在于,由于 Oracle 中的大多数分页黑客都使用内联 View ,因此应用进行更新是非法的。

那么有没有办法同时执行这两种操作,最好是在同一个 SQL 语句中?

我们现在尝试的示例...

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

我们得到的错误是ORA-02014:,无法从具有 DISTINCT、GROUP BY 等的 View 中选择 FOR UPDATE。

最佳答案

这是您可以执行的操作的示例

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.

关于oracle - Oracle 中的分页和锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12063965/

相关文章:

oracle - 一次从 PL/SQL 变量中添加一个元素到集合变量中?

oracle - 带有动态 SQL 语句的游标 For 循环

database - 数据库结构图怎么画

Oracle不等运算符: ¬=

oracle - 如何检查游标是否在oracle中返回任何记录?

sql - Oracle SQL Developer,在函数中使用动态 SQL

sql - 选择顶行时使用了错误的索引

sql - Oracle DB 插入并且对重复键不执行任何操作

java - 使用oracle jdbc模板在java中创建新的数据库连接

oracle - 如何在游标循环内使用批量收集追加表类型对象中的记录