Oracle PLSQLでDELETE後に条件に基づいた集計結果をRETURNINGで取得する方法

データベース

OracleのPLSQLを使用してデータを削除する際、特定の条件に基づいた集計結果を取得することが必要になる場合があります。例えば、DELETE文で削除したデータの内訳を学年別に取得し、その件数をログとして出力するというシナリオです。本記事では、DELETE文で集計結果をRETURNING句を用いて効率的に取得する方法について解説します。

1. PLSQLのDELETEとRETURNING句の基本的な使い方

まずは、OracleでのDELETE文における基本的な構文をおさらいしましょう。DELETE文でデータを削除する際、通常のDELETE操作に加えて、RETURNING句を使用することで、削除したデータをそのまま返すことができます。

基本的な構文は次のようになります。

DELETE FROM table_name WHERE condition RETURNING column_name INTO variable;

この構文により、削除されたデータの情報を一度に取得することができますが、集計を行う場合には少し工夫が必要です。

2. DELETE文とGROUP BYで集計を行う方法

質問のように、DELETE操作で削除したデータの内訳を学年別に集計する場合、GROUP BY句を使用する方法が考えられます。ただし、DELETE文自体にはGROUP BY句を組み合わせることができません。

そのため、DELETE操作とGROUP BYを組み合わせて集計結果を取得したい場合は、以下のアプローチを検討する必要があります。

  • 一度DELETEを実行して削除したデータをTEMPテーブルに保存する
  • その後、TEMPテーブルを使用してGROUP BYで集計を行う

この方法では、削除されたデータを一時的に保存しておくことで、後から必要な集計を行うことが可能になります。

3. BULK COLLECTを使ってDELETEの結果を効率的に取得する

質問では、BULK COLLECTを使ってDELETE後の結果を取得したいという要望がありました。BULK COLLECTは、複数の行を一度に処理するための効率的な方法であり、大量のデータを扱う際には非常に有用です。

削除した行をBULK COLLECTで取得するには、RETURNING句と組み合わせて、以下のように記述します。

DECLARE
  TYPE t_output IS TABLE OF TBL_学生%ROWTYPE;
  output t_output;
BEGIN
  DELETE FROM TBL_学生 WHERE 国語 < 50 RETURNING 学年 INTO output;
  -- 結果の処理

上記のように、BULK COLLECTを使用して削除したデータを一括で取得し、その後で集計を行うことができます。

4. DELETE文の後に集計を行う実践例

具体的な実践例として、国語の点数が50点未満の学生を削除し、学年ごとの削除件数をログとして出力する方法を考えてみましょう。

DECLARE
  TYPE t_output IS TABLE OF TBL_学生%ROWTYPE;
  output t_output;
  v_count NUMBER := 0;
BEGIN
  DELETE FROM TBL_学生 WHERE 国語 < 50 RETURNING 学年 BULK COLLECT INTO output;
  FOR i IN 1..output.COUNT LOOP
    -- 学年ごとの削除件数をカウント
    v_count := v_count + 1;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('削除件数: ' || v_count);
END;

このように、DELETE文で削除後に、削除されたデータをBULK COLLECTで取得し、ループ処理を使って集計することが可能です。

5. まとめ:DELETE後のデータ集計の効率化

OracleのPLSQLでは、DELETE文とRETURNING句を組み合わせてデータを削除する際に、その結果を効率的に取得する方法があります。特にBULK COLLECTを使用することで、大量のデータを効率的に扱うことができ、削除されたデータを後から集計することも可能です。

質問のように学年ごとの削除件数をカウントする場合は、DELETE後にその結果を集計することで、必要なデータを確実に取得できます。OracleのPLSQLを活用することで、データベース操作をより効率的に行えるようになるでしょう。

コメント

タイトルとURLをコピーしました