DB操作(INSERT、UPDATE、DELETE)

21.1 DB操作(INSERT、UPDATE、DELETE)

1. DB操作(INSERT、UPDATE、DELETE)

データベースの操作について説明します。

  • INSERT(挿入)
  • UPDATE(更新)
  • DELETE(削除)

INSERT(挿入)

INSERTは、データベーステーブルに、レコードを挿入する命令です。
挿入する構造(または内部テーブル)と挿入先DBテーブルは、同じ構造である必要があります。
また、キーが重複するレコードを挿入すると実行時エラーになるため、キー項目の重複に注意しましょう。

● 単一行の挿入:INSERT <DBtab> FROM <構造>. ● 複数行の一括挿入:INSERT <DBtab> FROM TABLE <内部テーブル>.

サンプルコード
REPORT Z_SAMPLE211_INSERT.

" 選択画面:登録する名前(必須)
PARAMETERS P_NAME TYPE NAME OBLIGATORY.

START-OF-SELECTION.

  " 登録用の作業データ(VALUE で必要項目だけ設定)
  DATA(LS_DB) = VALUE ZDBTBL_TEST_DBOP(
                  NAME = P_NAME ).

  " 1行 INSERT
  INSERT INTO ZDBTBL_TEST_DBOP VALUES @LS_DB.

  " 実行結果を確認(0:成功、それ以外:失敗)
  IF SY-SUBRC = 0.
    WRITE: / |INSERT 成功:NAME={ LS_DB-NAME }|.
  ELSE.
    WRITE: / |INSERT 失敗:SY-SUBRC={ SY-SUBRC }|.
  ENDIF.
検証手順

1. 任意の値を[P_NAME]に値を入力し、実行ボタンを押下します。

2. 実行完了画面が表示されます。

3. データブラウザ[SE16]でテーブル名[ZDBTBL_TEST_DBOP]の内容を確認します。

INSERT(ACCEPTING DUPLICATE KEYS)

オプションとしてINSERT命令の最後に、「ACCEPTING DUPLICATE KEYS.」と記述すると、同じキーを持つ項目を挿入してもショートダンプが発生せずに、リターンコード(SY-SUBRC)に「4」が設定されます。
通常は、一括挿入する前にチェックを入れるか、一括挿入した後、重複キーを持つ項目があった場合は、ロールバックを行うなどして、調整を行います。

サンプルコード:INSERT:ACCEPTING DUPLICATE KEYS

REPORT Z_SAMPLE211_INSERTDUB.

START-OF-SELECTION.

  " 一括登録用の内部テーブル
  DATA LT_DB TYPE STANDARD TABLE OF ZDBTBL_TEST_DBOP WITH EMPTY KEY.

  " ※キー定義に応じて、ここは「重複するキー」になる値を入れてください
  APPEND VALUE #( NAME = 'A' ) TO LT_DB.
  APPEND VALUE #( NAME = 'A' ) TO LT_DB.

  " 一括 INSERT(重複キーを許容)
  INSERT ZDBTBL_TEST_DBOP FROM TABLE @LT_DB ACCEPTING DUPLICATE KEYS.

  CASE SY-SUBRC.
    WHEN 0.
      WRITE: / 'INSERT 完了(重複なし)'.
    WHEN 4.
      WRITE: / 'INSERT 完了(重複キーあり:SY-SUBRC=4)'.
    WHEN OTHERS.
      WRITE: / |INSERT 失敗:SY-SUBRC={ SY-SUBRC }|.
  ENDCASE.

UPDATE(更新)

UPDATEはDB上のレコードを更新する命令です。
更新する構造(または内部テーブル)と更新先DBテーブルは、同じ構造である必要があります。
更新対象は、DB側のキー項目と、渡した構造(内部テーブル)のキーが一致する行です。
一致するキーが存在しない場合は、更新は行われません。

SET句には、更新したいデータベース側の項目と、更新したい構造の項目を指定します。WHERE句には 更新する時の条件式を記述します。
この時、注意しなくてはいけない点は、この構文では更新の際にキー項目を参照せずにWHERE条件のみを見て更新するということです。
条件次第では、データベーステーブルのすべてのレコードを更新してしまう可能性があるので注意が必要です。

サンプルコード:UPDATE(更新)
REPORT Z_SAMPLE211_UPDATE.

" 選択画面:更新対象の名前(必須)
PARAMETERS P_NAME TYPE NAME OBLIGATORY.

START-OF-SELECTION.

  " 更新先テーブルの型で作成(型不一致を避ける)
  DATA(LS_DB) = VALUE ZDBTBL_DBOP_UP(
                  NAME  = P_NAME
                  ZDATE = SY-DATUM ).  " システム日付で更新

  " キー一致行を更新(キーが無ければ更新されない)
  UPDATE ZDBTBL_DBOP_UP FROM @LS_DB.

  IF SY-SUBRC = 0.
    WRITE: / |UPDATE 成功:NAME={ LS_DB-NAME }, ZDATE={ LS_DB-ZDATE }|.
  ELSE.
    WRITE: / |UPDATE 対象なし/失敗:SY-SUBRC={ SY-SUBRC }|.
  ENDIF..

検証手順

1. データブラウザ[SE16]でテーブル名[ZDBTBL_DBOP_UP]の内容を確認します。

2. [P_NAME]に「A」を入力し、実行ボタンを押下します。

3. 日付(ZDATE)が実行した日付に更新されていることを確認します。

DELETE(削除)

DELETE はDB上のレコードを削除する命令です。一度削除すると元に戻せないため、削除条件は特に慎重に扱います。

構造/内部テーブル指定の削除に加えて、WHERE で直接条件指定もできますが、条件次第で複数件を一括削除してしまうため注意しましょう。

サンプルコード:DELETE(削除)
REPORT Z_SAMPLE211_DELETE.

" 選択画面:削除対象の名前(必須)
PARAMETERS P_NAME TYPE NAME OBLIGATORY.

START-OF-SELECTION.

  " 削除先テーブルの型で作成(型不一致を避ける)
  DATA(LS_DB) = VALUE ZDBTBL_DBOP_DEL(
                  NAME = P_NAME ).

  " キー一致行を削除
  DELETE ZDBTBL_DBOP_DEL FROM @LS_DB.

  IF SY-SUBRC = 0.
    WRITE: / |DELETE 成功:NAME={ LS_DB-NAME }|.
  ELSE.
    WRITE: / |DELETE 対象なし/失敗:SY-SUBRC={ SY-SUBRC }|.
  ENDIF.

検証手順

1. データブラウザ[SE16]でテーブル名[ZDBTBL_DBOP_DEL]の内容を確認します。

2. プログラムを起動し、P_NAMEに「A」を入力して実行します。

3. データブラウザ[SE16]で、テーブル名[ZDBTBL_DBOP_DEL]の内容から、 NAME「A」のレコードが削除されていることを確認します。


NEXT>> 21.2 COMMIT WORK / ROLLBACK WORK命令

研修の詳細はこちら