我在Java中的下列准备好的声明:维持秩序与选择... In和锁定线
with main_select as
(select request_id,rownum iden
from
(select request_id
from queue_requests
where request_status = 0 and
date_requested <= sysdate and
mod(request_id,?) = ?
order by request_priority desc, oper_id, date_requested)
where rownum < ?)
select *
from queue_requests qr, main_select ms
where qr.request_id in ms.request_id
order by ms.iden for update skip locked;
它不执行:
ORA-02014:不能选择从视图与DISTINCT,GROUP BY UPDATE等
我会尝试解释为什么我需要所有的SELECT语句:
- 第一个(内部)选择获得我需要的数据
- 第二个将行数限制为一个数字(我不能把它放在第一个选择中,因为oracle首先限制结果,并且只有在命令它们之后,这是不是我想要的)
- 第三(与外部)选择保留顺序(我尝试使用3嵌套选择 - 所以,没有子句 - 但我找不到一种方法来保存在这种情况下的顺序)。另外,它应该锁定queue_requests表中的行,但是因为我从with子句中选择了数据,所以会出现上述错误。
所以,我想从queue_requests中选择数据,保留第一个x行,保留select的顺序并锁定行。
有没有办法做到这一点?
我意识到,在我的具体情况下,我选择数据与MOD,所以每个线程将选择自己的表的一部分,所以我可以安全地删除“更新跳过锁定”。但是,对于一般情况下,其中的选择不使用MOD,它确实需要锁定线路,我会保持打开这个问题。 – Anakin001