ABAP INSERTについて

ABAPでINSERT文を使用する基礎知識

INSERT文の基本構文と動作の仕組み

ABAPのINSERT文は、データベースや内部テーブルにレコードを追加するための基本的なSQL操作です。使用対象(データベース/内部テーブル)とレコード数(単一/複数)によって4つの主要パターンに分類されます。

1. データベースへの単一レコード挿入

* 基本構文
INSERT INTO DBテーブル名 VALUES 構造名.

* 実装例
INSERT INTO zt_employee VALUES @ls_employee.

2. データベースへの複数レコード挿入

* 基本構文
INSERT DBテーブル名 FROM TABLE 内部テーブル [ACCEPTING DUPLICATE KEYS].

* ACCEPTING DUPLICATE KEYS: 重複キーのレコードが存在した場合の動作を指定
* - 指定なし:重複エラーでショートダンプ
* - 指定あり:重複キーエラーを許容し、エラーが発生しても処理を続行する

* 実装例
* 重複チェックあり(デフォルト)
INSERT zt_employee FROM TABLE @lt_employees.

* 重複チェックなし
INSERT zt_employee FROM TABLE @lt_employees ACCEPTING DUPLICATE KEYS.

3. 内部テーブルへの単一レコード挿入

* 基本構文
INSERT 構造体 INTO TABLE 内部テーブル名.
INSERT 構造体 INTO 内部テーブル名 [INDEX 挿入位置].

* INDEX: レコードを挿入する位置を指定(標準テーブルのみ使用可)
* - 指定なし:テーブルタイプに応じた位置(標準テーブルは末尾、ソートテーブルはソート順)
* - 指定あり:指定した位置に挿入(既存レコードは後方シフト)

* 実装例
* 通常の挿入
INSERT ls_employee INTO TABLE lt_employees.

* 特定の位置に挿入
INSERT ls_employee INTO lt_employees INDEX lv_index.

4. 内部テーブルへの複数レコード挿入

* 基本構文
INSERT LINES OF コピー元内部テーブル INTO TABLE コピー先内部テーブル.
INSERT LINES OF コピー元内部テーブル FROM 開始位置 TO 終了位置 INTO TABLE コピー先内部テーブル.

* 実装例
* 全レコードの挿入
INSERT LINES OF lt_source INTO TABLE lt_target.

* 特定範囲の挿入
INSERT LINES OF lt_source FROM lv_from TO lv_to INTO TABLE lt_target.

シングルレコードのINSERT処理実装手順

INSERT INTO文による1件のレコード追加方法

シングルレコードのINSERT処理は、ABAPで最も基本的なデータ登録処理です。ここでは、効率的で安全な実装方法について解説します。

基本的な実装パターン

* 1. 構造体の宣言とデータ設定
DATA: ls_employee TYPE zt_employee.

* データ設定
ls_employee-id          = '1001'.
ls_employee-name        = 'John Smith'.
ls_employee-department  = 'IT'.
ls_employee-entry_date  = sy-datum.  "システム日付
ls_employee-status      = 'A'.       "Active

* 2. INSERT実行とエラーハンドリング
INSERT INTO zt_employee VALUES @ls_employee.
IF sy-subrc = 0.
  COMMIT WORK AND WAIT.  "同期的なコミット
  MESSAGE 'Record inserted successfully.' TYPE 'S'.
ELSE.
  ROLLBACK WORK.
  MESSAGE 'Insert failed.' TYPE 'E'.
ENDIF.

効率的な実装のためのベストプラクティス

  1. 事前バリデーション
* データ検証用のメソッド例
METHOD validate_employee_data.
  DATA: lv_error TYPE boolean.

  " 必須項目チェック
  IF is_employee-id IS INITIAL OR
     is_employee-name IS INITIAL.
    lv_error = abap_true.
  ENDIF.

  " ID形式チェック(例:4桁の数字)
  IF NOT matches( val = is_employee-id 
                 regex = '^\d{4}$' ).
    lv_error = abap_true.
  ENDIF.

  " エラーがある場合は例外を発生
  IF lv_error = abap_true.
    RAISE EXCEPTION TYPE cx_invalid_data.
  ENDIF.
ENDMETHOD.
  1. トランザクション制御の最適化
* トランザクション制御を含むINSERT処理の例
METHOD insert_employee.
  DATA: ls_employee TYPE zt_employee.

  " トランザクション開始
  GET TIME STAMP FIELD DATA(lv_start_time).

  TRY.
      " データ検証
      validate_employee_data( is_employee ).

      " INSERT実行
      INSERT INTO zt_employee VALUES @is_employee.

      " 正常終了時のコミット
      COMMIT WORK AND WAIT.

      " 処理時間の記録(オプション)
      GET TIME STAMP FIELD DATA(lv_end_time).
      log_processing_time( 
        iv_start_time = lv_start_time
        iv_end_time   = lv_end_time ).

  CATCH cx_invalid_data INTO DATA(lx_error).
      " エラー処理
      ROLLBACK WORK.
      log_error( lx_error ).
  ENDTRY.
ENDMETHOD.

パフォーマンス最適化のポイント

  1. バッファ利用の最適化
  • テーブルバッファを効果的に活用
  • 不要なバッファ更新を防ぐ
  1. コミットのタイミング
  • 適切なタイミングでコミット
  • 必要に応じて非同期コミットを使用

コード品質を高めるためのチェックリスト

チェック項目説明重要度
データ検証全ての必須項目と形式チェック
エラーハンドリング例外処理の実装
トランザクション制御適切なCOMMIT/ROLLBACK
パフォーマンス考慮バッファ利用の最適化
ログ記録エラーログと処理時間の記録
コメント処理の目的と仕様の記載

実装時の注意点

  1. データの整合性確保
  • 主キー重複チェック
  • 外部キー制約の考慮
  • トランザクションの適切な管理
  1. エラーハンドリング
  • 具体的なエラーメッセージの提供
  • ログ記録による追跡可能性の確保
  • リカバリー処理の実装
  1. 保守性への配慮
  • コードの構造化
  • 適切なコメント付与
  • 命名規則の遵守

このように、シングルレコードのINSERT処理でも、品質の高い実装のために考慮すべき点は多岐にわたります。基本的な実装パターンを理解した上で、これらのベストプラクティスを適用することで、より堅牢なプログラムを作成することができます。

マルチレコードのINSERT処理最適化テクニック

INSERT文による複数レコードの一括登録方法

大量データを効率的に処理するための一括INSERT処理について、最適な実装方法と注意点を解説します。

基本的な一括INSERT実装

* 1. 内部テーブルの準備
DATA: lt_employees TYPE TABLE OF zt_employee,
      ls_employee  TYPE zt_employee.

* 2. 複数レコードの一括INSERT
METHOD insert_employees_bulk.
  TRY.
      INSERT zt_employee FROM TABLE @it_employees
        ACCEPTING DUPLICATE KEYS.

      IF sy-subrc = 0.
        COMMIT WORK AND WAIT.
        rv_success = abap_true.
      ELSE.
        ROLLBACK WORK.
        rv_success = abap_false.
      ENDIF.

  CATCH cx_root INTO DATA(lx_error).
      ROLLBACK WORK.
      log_error( lx_error ).
      rv_success = abap_false.
  ENDTRY.
ENDMETHOD.

パフォーマンス最適化テクニック

  1. バッチサイズの最適化
* 最適なバッチサイズでの分割処理
METHOD insert_with_optimal_batch.
  CONSTANTS: lc_batch_size TYPE i VALUE 1000.
  DATA: lt_batch TYPE TABLE OF zt_employee.

  WHILE lines( it_employees ) > 0.
    " バッチサイズ分のデータを取得
    lt_batch = VALUE #( 
      FOR i = 1 WHILE i <= lc_batch_size 
      AND i <= lines( it_employees )
      ( it_employees[ i ] ) ).

    " バッチ処理実行
    INSERT zt_employee FROM TABLE @lt_batch.

    " 成功した場合、処理済みデータを削除
    IF sy-subrc = 0.
      DELETE it_employees TO lc_batch_size.
      COMMIT WORK AND WAIT.
    ELSE.
      ROLLBACK WORK.
      EXIT.  " エラー発生時は処理中断
    ENDIF.
  ENDWHILE.
ENDMETHOD.
  1. パラレル処理の活用
* パラレル処理を利用した高速化
METHOD insert_parallel.
  DATA: lt_packages TYPE TABLE OF rspc_t_func_pool.

  " データを複数パッケージに分割
  lt_packages = split_data_into_packages( 
    it_data        = it_employees
    iv_package_size = 1000 ).

  " パラレル処理の実行
  CALL FUNCTION 'ZSPC_PARALLEL_INSERT'
    STARTING NEW TASK 'PARALLEL_INSERT'
    DESTINATION IN GROUP 'parallel_generators'
    PERFORMING handle_package ON END OF TASK
    TABLES
      it_packages = lt_packages.

  WAIT UNTIL gv_all_packages_processed = abap_true.
ENDMETHOD.

処理効率を高めるためのベストプラクティス

テクニック効果実装の複雑さ推奨ケース
バッチ処理定期的な大量データ登録
パラレル処理非常に高リアルタイム性が要求される場合
非同期処理バックグラウンド処理

パフォーマンスモニタリング

* パフォーマンス計測用のユーティリティクラス
CLASS lcl_performance_monitor DEFINITION.
  PUBLIC SECTION.
    METHODS:
      start_monitoring,
      end_monitoring,
      get_statistics RETURNING VALUE(rs_stats) TYPE ty_stats.
  PRIVATE SECTION.
    DATA:
      mv_start_time TYPE timestamp,
      mv_end_time   TYPE timestamp,
      mv_records    TYPE i.
ENDCLASS.

エラーハンドリングと回復戦略

  1. エラー検出と記録
* エラーハンドリングの実装例
METHOD handle_insert_errors.
  DATA: lt_failed_records TYPE TABLE OF zt_employee.

  " 失敗したレコードの収集
  lt_failed_records = VALUE #( FOR rec IN it_employees
    WHERE ( status = 'ERROR' ) ( rec ) ).

  " エラーログの記録
  log_failed_records( lt_failed_records ).

  " リトライキューへの登録
  enqueue_for_retry( lt_failed_records ).
ENDMETHOD.
  1. リカバリー処理
* リカバリー処理の実装
METHOD recover_failed_inserts.
  DATA: lt_retry_records TYPE TABLE OF zt_employee.

  " リトライキューからデータ取得
  SELECT * FROM zt_retry_queue
    INTO TABLE @lt_retry_records
    WHERE status = 'PENDING'
    ORDER BY priority.

  " リトライ処理実行
  LOOP AT lt_retry_records INTO DATA(ls_retry).
    TRY.
        insert_single_record( ls_retry ).
        update_retry_status( 
          iv_record_id = ls_retry-id
          iv_status    = 'SUCCESS' ).
    CATCH cx_root.
        update_retry_status( 
          iv_record_id = ls_retry-id
          iv_status    = 'FAILED' ).
    ENDTRY.
  ENDLOOP.
ENDMETHOD.

これらの実装方法を適切に組み合わせることで、大量データの一括INSERT処理を効率的に実現できます。特に、パフォーマンスとエラーハンドリングのバランスを考慮した実装が重要です。

データ整合性を保証するINSERT処理の実装

重複チェックロジックの実装方法

データ整合性を維持するための重複チェックと、その実装パターンについて解説します。

1. 基本的な重複チェック実装

* 単一キーでの重複チェック
METHOD check_duplicate_employee.
  DATA: lv_exists TYPE abap_bool.

  SELECT SINGLE @abap_true
    FROM zt_employee
    WHERE id = @is_employee-id
    INTO @lv_exists.

  IF lv_exists = abap_true.
    RAISE EXCEPTION TYPE zcx_duplicate_entry
      EXPORTING
        textid = zcx_duplicate_entry=>employee_id_exists
        employeeid = is_employee-id.
  ENDIF.
ENDMETHOD.

* 複合キーでの重複チェック
METHOD check_duplicate_contract.
  SELECT SINGLE @abap_true
    FROM zt_contracts
    WHERE employee_id = @is_contract-employee_id
      AND valid_from = @is_contract-valid_from
    INTO @DATA(lv_exists).

  IF lv_exists = abap_true.
    RAISE EXCEPTION TYPE zcx_duplicate_entry.
  ENDIF.
ENDMETHOD.

2. 高度な整合性チェック実装

CLASS lcl_data_integrity_checker DEFINITION.
  PUBLIC SECTION.
    METHODS:
      * 包括的な整合性チェック
      check_data_integrity
        IMPORTING
          is_data          TYPE any
          iv_check_type    TYPE char1
        RETURNING
          VALUE(rv_valid)  TYPE abap_bool
        RAISING
          zcx_data_integrity,

      * 関連テーブルとの整合性チェック
      check_referential_integrity
        IMPORTING
          is_data  TYPE any
        RAISING
          zcx_referential_integrity.

  PRIVATE SECTION.
    METHODS:
      check_mandatory_fields,
      check_value_ranges,
      check_business_rules.
ENDCLASS.

* 実装例
METHOD check_data_integrity.
  " 必須項目チェック
  check_mandatory_fields( is_data ).

  " 値範囲チェック
  check_value_ranges( is_data ).

  " ビジネスルールチェック
  check_business_rules( is_data ).

  rv_valid = abap_true.
ENDMETHOD.

3. トランザクション制御を含めた実装

* トランザクション制御を含む登録処理
METHOD insert_with_integrity_check.
  " トランザクション開始
  GET TIME STAMP FIELD DATA(lv_start_time).

  TRY.
      " ロック設定
      CALL FUNCTION 'ENQUEUE_EZ_EMPLOYEE'
        EXPORTING
          mode_zt_employee = 'E'
          mandt           = sy-mandt
          id             = is_employee-id
        EXCEPTIONS
          foreign_lock   = 1
          system_failure = 2
          OTHERS         = 3.

      IF sy-subrc <> 0.
        RAISE EXCEPTION TYPE zcx_lock_error.
      ENDIF.

      " 整合性チェック
      mo_integrity_checker->check_data_integrity(
        is_data       = is_employee
        iv_check_type = 'I' ).

      " データ登録
      INSERT zt_employee FROM @is_employee.

      " コミット
      COMMIT WORK AND WAIT.

      " ロック解放
      CALL FUNCTION 'DEQUEUE_EZ_EMPLOYEE'
        EXPORTING
          mode_zt_employee = 'E'
          mandt           = sy-mandt
          id             = is_employee-id.

  CATCH zcx_data_integrity INTO DATA(lx_integrity)
      OR zcx_lock_error INTO DATA(lx_lock).

    " ロールバックとロック解放
    ROLLBACK WORK.
    CALL FUNCTION 'DEQUEUE_ALL'.

    " エラーログ記録
    log_error( lx_integrity ).

    RAISE EXCEPTION TYPE zcx_insert_failed
      EXPORTING
        previous = lx_integrity.
  ENDTRY.
ENDMETHOD.

データ整合性チェックリスト

チェック項目実装レベル重要度説明
主キー重複データベース最高一意性制約による保証
外部キー参照アプリケーション関連データの存在確認
必須項目アプリケーションNOT NULL項目の入力確認
値範囲アプリケーション許容値の範囲チェック
ビジネスルールアプリケーション業務ロジックに基づく整合性

実装時の注意点

  1. パフォーマンスへの配慮
  • インデックスの効果的な活用
  • 必要最小限のロック範囲
  • 適切なコミットタイミング
  1. エラーハンドリング
  • 具体的なエラーメッセージ
  • トランザクションの適切な制御
  • ロックの確実な解放
  1. 保守性への配慮
  • チェックロジックの集約
  • 再利用可能なコンポーネント化
  • 適切なドキュメント化

これらの実装パターンを適切に組み合わせることで、データ整合性を確実に保証するINSERT処理を実現できます。

INSERT処理の実装における注意点とトラブルシューティング

よくあるエラーとその対処方法

INSERT処理で発生する一般的なエラーとその解決方法について、実践的な対処方法を解説します。

1. 主要なエラーパターンと対処法

エラーコードエラー内容主な原因対処方法
DBSQL_DUPLICATE_KEY一意制約違反主キーの重複既存データの確認と一意性の保証
DBSQL_NOT_NULLNOT NULL制約違反必須項目の未設定必須項目の入力チェック
DBSQL_FOREIGN_KEY外部キー制約違反参照整合性エラー関連データの存在確認
DBSQL_MAX_LENGTH最大長超過フィールド長の超過データ長のバリデーション
DBSQL_CONVERSION_ERROR型変換エラーデータ型の不一致適切なデータ型変換の実装
* エラーハンドリングの実装例
METHOD handle_insert_error.
  CASE cx_root=>get_text( ).
    WHEN 'DBSQL_DUPLICATE_KEY'.
      " 重複キーエラーの処理
      handle_duplicate_key_error(
        is_data    = is_record
        io_error   = io_error ).

    WHEN 'DBSQL_NOT_NULL'.
      " NULL値エラーの処理
      handle_not_null_error(
        is_data    = is_record
        io_error   = io_error ).

    WHEN OTHERS.
      " その他のエラー処理
      handle_general_error(
        is_data    = is_record
        io_error   = io_error ).
  ENDCASE.
ENDMETHOD.

2. エラー予防のためのバリデーション実装

CLASS lcl_data_validator DEFINITION.
  PUBLIC SECTION.
    METHODS:
      validate_before_insert
        IMPORTING
          is_data           TYPE any
        RETURNING
          VALUE(rt_errors)  TYPE ty_error_tab.

  PRIVATE SECTION.
    METHODS:
      check_data_types,
      check_field_lengths,
      check_mandatory_fields,
      check_value_ranges.
ENDCLASS.

METHOD validate_before_insert.
  " データ型チェック
  rt_errors = VALUE #( BASE rt_errors
    ( LINES OF check_data_types( is_data ) ) ).

  " フィールド長チェック
  rt_errors = VALUE #( BASE rt_errors
    ( LINES OF check_field_lengths( is_data ) ) ).

  " 必須項目チェック
  rt_errors = VALUE #( BASE rt_errors
    ( LINES OF check_mandatory_fields( is_data ) ) ).

  " 値範囲チェック
  rt_errors = VALUE #( BASE rt_errors
    ( LINES OF check_value_ranges( is_data ) ) ).
ENDMETHOD.

デバッグとパフォーマンスモニタリングの方法

1. SQL トレース活用法

* SQLトレース取得用のユーティリティクラス
CLASS lcl_sql_trace DEFINITION.
  PUBLIC SECTION.
    METHODS:
      start_trace,
      stop_trace,
      analyze_trace
        RETURNING
          VALUE(rt_analysis) TYPE ty_trace_analysis.
ENDCLASS.

METHOD analyze_trace.
  " トレース結果の解析
  SELECT *
    FROM d_sql_trace
    WHERE trace_timestamp BETWEEN @mv_start_time AND @mv_end_time
    INTO TABLE @DATA(lt_trace).

  " 実行時間の分析
  LOOP AT lt_trace INTO DATA(ls_trace).
    ANALYZE ls_trace-execution_time.
  ENDLOOP.
ENDMETHOD.

2. パフォーマンスモニタリング実装

* パフォーマンスモニタリングの実装例
METHOD monitor_insert_performance.
  DATA: lv_start_time TYPE timestamp,
        lv_end_time   TYPE timestamp,
        lv_duration   TYPE decimal.

  GET TIME STAMP FIELD lv_start_time.

  " INSERT処理の実行
  TRY.
      execute_insert( ).

    CATCH cx_root INTO DATA(lx_error).
      handle_error( lx_error ).
  ENDTRY.

  GET TIME STAMP FIELD lv_end_time.

  " 処理時間の計算と記録
  lv_duration = calculate_duration(
    iv_start_time = lv_start_time
    iv_end_time   = lv_end_time ).

  log_performance_data(
    iv_duration = lv_duration
    is_metrics  = get_performance_metrics( ) ).
ENDMETHOD.

3. トラブルシューティングのベストプラクティス

  1. 段階的なデバッグアプローチ
  • データ検証
  • SQL実行計画の確認
  • ロック状況の確認
  • トランザクション状態の確認
  1. ログ記録の重要性
* 包括的なログ記録の実装
METHOD log_insert_operation.
  DATA: ls_log TYPE zst_insert_log.

  " ログデータの設定
  ls_log = VALUE #(
    timestamp     = sy-datum
    user          = sy-uname
    operation     = 'INSERT'
    table_name    = iv_table_name
    record_count  = iv_record_count
    duration      = iv_duration
    status        = iv_status
    error_message = iv_error_message
  ).

  " ログの保存
  INSERT ztt_insert_log FROM @ls_log.
ENDMETHOD.
  1. パフォーマンス改善のチェックポイント
確認項目チェック内容改善方法
テーブルバッファバッファ利用状況バッファ設定の最適化
インデックスインデックスの使用状況適切なインデックス設定
ロック待ちロック競合の有無ロック戦略の見直し
コミット頻度コミットタイミング適切なコミット間隔設定

これらの実装と対策を適切に組み合わせることで、安定したINSERT処理の運用が可能になります。

実践的なコード例で学ぶINSERT処理の応用

業務システムでよく使用されるINSERTパターン

実際の業務システムで頻繁に使用されるINSERT処理のパターンと、その実装例を解説します。

1. マスタデータ登録処理

* マスタデータ登録クラス
CLASS zcl_master_data_manager DEFINITION.
  PUBLIC SECTION.
    METHODS:
      * マスタデータ一括登録
      import_master_data
        IMPORTING
          it_data          TYPE ANY TABLE
        RETURNING
          VALUE(rt_result) TYPE ty_import_result
        RAISING
          zcx_master_data_error.

  PRIVATE SECTION.
    METHODS:
      validate_master_data,
      handle_duplicates,
      update_reference_data.
ENDCLASS.

* 実装例
METHOD import_master_data.
  " トランザクション制御
  CALL FUNCTION 'ENQUEUE_E_TABLE'
    EXPORTING
      tabname = 'ZT_MASTER'.

  TRY.
      " データ検証
      validate_master_data( it_data ).

      " 重複チェックと処理
      handle_duplicates( it_data ).

      " 一括登録
      INSERT zt_master FROM TABLE @it_data
        ACCEPTING DUPLICATE KEYS.

      " 参照データの更新
      update_reference_data( it_data ).

      " コミット
      COMMIT WORK AND WAIT.

    CATCH cx_root INTO DATA(lx_error).
      ROLLBACK WORK.

      rt_result-success = abap_false.
      rt_result-message = lx_error->get_text( ).
  ENDTRY.

  " ロック解放
  CALL FUNCTION 'DEQUEUE_E_TABLE'
    EXPORTING
      tabname = 'ZT_MASTER'.
ENDMETHOD.

2. トランザクションデータの登録処理

* トランザクションデータ登録クラス
CLASS zcl_transaction_manager DEFINITION.
  PUBLIC SECTION.
    METHODS:
      create_transaction
        IMPORTING
          is_header        TYPE zstt_trans_header
          it_items         TYPE ztt_trans_items
        RETURNING
          VALUE(rv_trans_id) TYPE ztrans_id
        RAISING
          zcx_transaction_error.

  PRIVATE SECTION.
    METHODS:
      generate_transaction_id,
      validate_transaction,
      update_stock_quantity,
      create_audit_log.
ENDCLASS.

METHOD create_transaction.
  " トランザクションID生成
  rv_trans_id = generate_transaction_id( ).

  TRY.
      " ヘッダデータ設定
      DATA(ls_header) = is_header.
      ls_header-trans_id = rv_trans_id.
      ls_header-create_date = sy-datum.
      ls_header-create_time = sy-uzeit.
      ls_header-create_user = sy-uname.

      " データ検証
      validate_transaction(
        is_header = ls_header
        it_items  = it_items ).

      " ヘッダ登録
      INSERT ztt_trans_header FROM @ls_header.

      " 明細登録
      LOOP AT it_items INTO DATA(ls_item).
        ls_item-trans_id = rv_trans_id.
        INSERT ztt_trans_items FROM @ls_item.

        " 在庫数更新
        update_stock_quantity(
          iv_material = ls_item-material
          iv_quantity = ls_item-quantity ).
      ENDLOOP.

      " 監査ログ作成
      create_audit_log(
        iv_trans_id = rv_trans_id
        is_header   = ls_header
        it_items    = it_items ).

      COMMIT WORK AND WAIT.

    CATCH cx_root INTO DATA(lx_error).
      ROLLBACK WORK.
      RAISE EXCEPTION TYPE zcx_transaction_error
        EXPORTING
          previous = lx_error.
  ENDTRY.
ENDMETHOD.

実際のプロジェクトで使える実装テンプレート

1. 汎用データ登録テンプレート

* 汎用データ登録クラス
CLASS zcl_generic_data_manager DEFINITION.
  PUBLIC SECTION.
    METHODS:
      constructor
        IMPORTING
          iv_table_name TYPE tabname,

      insert_data
        IMPORTING
          it_data          TYPE ANY TABLE
          iv_commit_count  TYPE i DEFAULT 1000
        RETURNING
          VALUE(rt_result) TYPE ty_insert_result.

  PRIVATE SECTION.
    DATA:
      mv_table_name    TYPE tabname,
      mo_validator     TYPE REF TO zcl_data_validator,
      mo_logger        TYPE REF TO zcl_operation_logger.

    METHODS:
      process_batch
        IMPORTING
          it_batch         TYPE ANY TABLE
        RETURNING
          VALUE(rt_result) TYPE ty_batch_result.
ENDCLASS.

METHOD insert_data.
  DATA: lt_batch TYPE TABLE OF ty_batch_result.

  " バッチ処理
  WHILE lines( it_data ) > 0.
    DATA(lt_current_batch) = VALUE #(
      FOR i = 1 UNTIL i > iv_commit_count
      ( CAST #( VALUE #( it_data[ i ] OPTIONAL ) ) ) ).

    IF lt_current_batch IS NOT INITIAL.
      " バッチ処理実行
      APPEND process_batch( lt_current_batch ) TO lt_batch.

      " 処理済みデータの削除
      DELETE it_data TO iv_commit_count.
    ENDIF.
  ENDWHILE.

  " 結果の集計
  rt_result = summarize_results( lt_batch ).
ENDMETHOD.

2. エラーハンドリング付きINSERTテンプレート

* エラーハンドリング付き登録処理テンプレート
CLASS zcl_resilient_insert DEFINITION.
  PUBLIC SECTION.
    TYPES:
      BEGIN OF ty_insert_config,
        max_retries     TYPE i,
        retry_interval  TYPE i,
        batch_size     TYPE i,
      END OF ty_insert_config.

    METHODS:
      constructor
        IMPORTING
          is_config TYPE ty_insert_config,

      insert_with_retry
        IMPORTING
          it_data          TYPE ANY TABLE
        RETURNING
          VALUE(rt_result) TYPE ty_insert_result.

  PRIVATE SECTION.
    DATA:
      ms_config TYPE ty_insert_config.

    METHODS:
      execute_with_retry
        IMPORTING
          it_batch TYPE ANY TABLE
        RAISING
          zcx_max_retry_exceeded.
ENDCLASS.

METHOD insert_with_retry.
  DATA: lt_failed_records TYPE TABLE OF ty_failed_record.

  " バッチ処理
  WHILE lines( it_data ) > 0.
    TRY.
        " リトライ付き実行
        execute_with_retry(
          it_batch = extract_batch(
            it_data      = it_data
            iv_batch_size = ms_config-batch_size ) ).

      CATCH zcx_max_retry_exceeded INTO DATA(lx_retry).
        " 失敗したレコードの記録
        APPEND LINES OF get_failed_records( lx_retry )
          TO lt_failed_records.
    ENDTRY.
  ENDWHILE.

  " 結果の返却
  rt_result = VALUE #(
    success_count = lines( it_data ) - lines( lt_failed_records )
    failed_records = lt_failed_records ).
ENDMETHOD.

これらのテンプレートは、実際のプロジェクトで必要に応じてカスタマイズして使用できます。基本的な機能を備えながら、拡張性も考慮した設計となっています。