Oracleでは、循環文の使用を最小限に抑える


-- Start
次は、ループ文を使用してテーブルレコードを削除する例です.
DECLARE
  TYPE NumList IS TABLE OF NUMBER;
  emps NumList := NumList(10, 30, 70);
BEGIN
  FOR i IN emps.FIRST..emps.LAST LOOP
    DELETE FROM employees WHERE employee_id = emps(i);
  END LOOP;
END;

あなたの仕事の中で、決して上の文を書かないでください.そうしないと、ためらうことなく自分に耳を傾けなければなりません.バッチを使うべきです.以下のようにします.
DECLARE
  TYPE NumList IS TABLE OF NUMBER;
  emps NumList := NumList(10, 30, 70);
BEGIN
  -- FORALL            
  FORALL i IN emps.FIRST..emps.LAST
    DELETE FROM employees WHERE employee_id = emps(i);
END;

または、次のようにTABLE式を使用します.
CREATE OR REPLACE TYPE number_table AS TABLE OF NUMBER;

DECLARE
  emps number_table := number_table(10, 30, 70);
BEGIN
  DELETE FROM employees WHERE employee_id IN (SELECT COLUMN_VALUE FROM TABLE(emps));
END;

--詳細は、「Oracle SQL最適化」を参照してください.
--声明:転載は出典を明記してください
-- Last edited on 2015-06-30
-- Created by ShangBo on 2015-06-30
-- End