sql - 在oracle 12c上用ROWNUM锁定的更新跳过

标签 sql multithreading oracle

我搜索了所有论坛,但没有找到任何线索。
我有一个多线程使用的临时表。
为了避免死锁,我正在使用类似以下的方法:

SELECT ID_MESSAGE
FROM TB_STAGE_IN S 
WHERE S.CD_STATUS = 0 
AND S.ID_JOB_SCHEDULE IS NULL 
AND ROWNUM <= 10000 
FOR UPDATE SKIP LOCKED; 

它工作正常,但线程最多不能达到10,000行。
就像是:
  • 线程1:5000
  • 线程2:3000
  • 线程2:2000

  • 我知道发生这种情况是因为它们的行号相同,但是表有成千上万的行。我真正需要的是线程在每一步都获得10,000行解锁。

    我尝试仅使用FETCH FIRST 10000 ROWS,但收到以下消息:
    ORA-02014:无法从具有DISTINCT,GROUP BY等的 View 中选择FOR UPDATE。

    大家能帮我吗?

    谢谢你的好意

    最佳答案

    Ask Tom有一个像这样的suggestion

    open C;  -- cursor C is select ... for update skip locked;
    
    loop
      fetch C bulk collect into :my_array limit 100;
      append :my_array to :to_be_processed_array;
      exit when c%notfound or :to_be_processed_array.count >= 10000;
    end loop;
    
    -- process any rows in :to_be_processed_array
    
    close C;
    

    关于sql - 在oracle 12c上用ROWNUM锁定的更新跳过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52121693/

    相关文章:

    带有allowCustomSqlDatabase ="true"的ASP.NET SessionState不调用指定的数据库

    c# - 如何检查列是否已经是外键?

    java - 从 BlockingQueue 获取时缺少项目

    oracle - ORA-30036 : unable to extend segment by 8 in undo tablespace 'UNDOTBS'

    sql - 在 Oracle 21c 中为 ALL_OBJECTS.OBJECT_ID 和 ALL_ARGUMENTS.OBJECT_ID 报告了不同的值

    sql - PostgreSQL如何获取同一列多个值的最新记录?

    sql - 在HIVE SQL中替换NULL或空值的函数

    android - Android 中的时间延迟

    c# - ActiveX DLL 锁定主 UI 线程

    java - 使用触发器删除 Oracle 表中的行