Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle中的分页与锁定_Oracle - Fatal编程技术网

Oracle中的分页与锁定

Oracle中的分页与锁定,oracle,Oracle,我已经看到了很多关于在Oracle中使用rownum或排名分析函数进行分页的答案。但是,我特别希望对这些分页结果应用锁定。问题在于,由于Oracle中的大多数分页攻击都使用内嵌视图,因此申请更新是非法的 那么,有没有一种方法可以同时执行这两种操作,最好是在同一个SQL语句中执行 我们现在尝试的一个例子 select * from ( select ... from t where ... order by ... ) where rownum <= ?

我已经看到了很多关于在Oracle中使用rownum或排名分析函数进行分页的答案。但是,我特别希望对这些分页结果应用锁定。问题在于,由于Oracle中的大多数分页攻击都使用内嵌视图,因此申请更新是非法的

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

我们现在尝试的一个例子

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

我们得到的错误是ORA-02014:,无法使用DISTINCT、GROUP BY等从视图中选择进行更新。

下面是一个可以执行的示例

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.

为什么要锁定生成的行?还有,你到底试过什么?我很确定,即使查询使用ROWNUM或分析函数,也可以使用FOR UPDATE进行查询,但发布查询后,我们可以看到。至于原因,我开发了一个O/RM解决方案Hibernate,这一需求由此产生。在某些情况下,我们得到了1个sql、2个分页限制和3个锁定要求,我们需要将它们结合起来应用。这在大多数数据库上都很容易,因为大多数数据库都具有一流的分页支持。我经常遇到的错误是:ORA-02014:,无法使用DISTINCT、GROUP BY等从视图中选择更新。。不是使用rownum/analytics造成问题;据我所知,问题在于,为了使用rownum/analytics正确地限制行,必须使用内联视图,然后Oracle会抱怨与内联视图一起进行更新。Marcin,这与我们目前的做法没有太大区别。但我们的尝试导致ORA-02014:,无法使用DISTINCT、GROUP BY等从视图中选择更新。请注意,在我的示例中,我不是从内联视图中选择;子选择仅出现在where子句中。这就不同了。我们必须尝试并调整这种方法以适应我们的情况。我们有一个传入的SQL语句,所以它有点复杂,不是吗;我尝试过使用rownum而不是解析函数来实现它,但它只在某些情况下有效。据您所知,这是否也应该使用rownum工作?我这样做的原因是这是一个通用方法。它接受SQL字符串并调整它以进行分页。因此,使用rownum执行调整更简单。但是如果使用解析函数可以神奇地使这项工作更加一致,我会做这项工作。没有足够的字符。下一篇评论中的SQL对我来说,它落下的SQL是select。。。从t中选择rowid中的rowid\uuuuu从t中选择rowid rowid\uuuu从t按对象排序\uID中的rownum>?和罗纳姆