簡體   English   中英

具有刪除和循環功能的Oracle ROWNUM

[英]Oracle ROWNUM with DELETE and Looping

想知道是否有人可以為我確認下面的delete語句以及下面設置的循環。 我要執行的操作是刪除CREATED_DATE的日期超過90天的記錄,但一次僅刪除1k條記錄。 如果正確,我計划將其放入下面列出的循環中。 使用ROWNUM時,我遇到了不同的結果,只是想確認一下。

DELETE from
(select * from ESPADMIN.ESP_STATUS_MESSAGE where CREATED_DATE <SYSDATE-90)
WHERE ROWNUM <1001 ;
commit;


LOOP
DELETE from
(select * from ESPADMIN.ESP_STATUS_MESSAGE where CREATED_DATE <SYSDATE-90)
WHERE ROWNUM <1001 ;
commit;
END LOOP;

您可能想要類似的東西:

DECLARE 
  cnt INT;
BEGIN
  SELECT COUNT(*)    -- 0/1
  INTO cnt
  FROM dual
  WHERE EXISTS (SELECT 1 
               FROM ESPADMIN.ESP_STATUS_MESSAGE 
               where CREATED_DATE <SYSDATE-90);

  WHILE (cnt > 0) LOOP
    DELETE ESPADMIN.ESP_STATUS_MESSAGE 
    where CREATED_DATE <SYSDATE-90
      AND rownum < 1001;

    COMMIT;

    SELECT COUNT(*)
    INTO cnt
    FROM dual
    WHERE EXISTS (SELECT 1 
                  FROM ESPADMIN.ESP_STATUS_MESSAGE 
                  where CREATED_DATE <SYSDATE-90);
  END LOOP;
END;

編輯:

我將您的示例重寫為:

BEGIN
LOOP 
  DELETE from (select * 
               from ESPADMIN.ESP_STATUS_MESSAGE where CREATED_DATE <SYSDATE-90) 
  WHERE ROWNUM <1001 ;
  EXIT WHEN sql%ROWCOUNT = 0;
  commit;
END LOOP;
COMMIT;
END;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM