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」のレコードが削除されていることを確認します。