データベース / 内部テーブルに対してレコードの追加を行うINSERT文について解説します。
INSERT文はレコード追加するだけ!と考えがちですが、実は追加したいレコード数や追加方法に応じて利用するオプションが結構たくさんあるので割と奥が深い命令です。
このページでは、利用できるオプションも含めて実践で役立つ内容を網羅的に整理していきます。
ABAPerを目指す方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧ください。
INSERT命令とは?
INSERTとは英語で「挿入する」という意味になります。その名の通り、データベース/内部テーブルにレコードを挿入する命令です。
似たような命令にAPPEND命令があります。APPEND命令も、INSERT命令と同様、内部テーブルにレコードを追加することができるのですが、両者は挿入方法に微妙な違いがあります。
INSERT命令の構文ルールを学ぶ前に、APPEND命令とINSERT命令の違いだけ説明しておきます。
INSERT命令とAPPEND命令の違い
まず、初心者ほど間違いやすいのですが、APPEND命令はデータベースへのレコード追加では利用できません。この点は前提として理解しておきましょう。
また、同じ内部テーブルに対しても処理の仕方に以下のような違いが存在します。
INSERT命令
APPEND命令
INSERTでは、好きなところにレコード挿入ができるのに対して、APPENDは一番最後にだけレコード追加ができるということです。
本ページではINSERT命令をメインに解説しております。APPEND命令の構文ルールや使いどころについては、以下の記事で詳しく解説しておりますので、合わせてご覧ください。
尚、パフォーマンスの観点から言うと、APPEND命令が優れているため、レコードの追加位置を特に問わない場合はAPPEND命令を利用するのがおすすめです。
ここからは、具体的な構文ルールとINSERT命令の使い方を確認していきます。
構文ルール:INSERT命令
INSERT命令は、追加する先がデータベース(実テーブル)なのか?内部テーブルなのか?で構文ルールが異なります。
この区別で混乱してしまうケースが多々あります。
ここでは、それぞれの構文ルールを1つずつ解説していきます。
DBへのレコード挿入(単一レコード)
INSERT INTO(DBテーブル)VALUES (構造名).
INSERT INTO (DBテーブル) VALUES (構造名).
※「INSERT INTO (DBテーブル名) FROM (構造名).」 でも可
(構造)に保持しているレコードをDBテーブルに挿入します。もちろん、(構造)は挿入先のテーブル(データベース)と同一の構造である必要があります。
正常にレコードが挿入された場合は、SY-SUBRCには0が。エラーの場合は4が設定されます。
SY-SUBRCは、SAPにおけるBoolean型のような役割を担う変数のようなものです。
システム項目は、ABAPを学ぶ上での超・必須知識ですので、理解できていない方はこの機会に合わせて必ず理解しておきましょう。
DBへのレコード挿入(複数レコード)
INSERT INTO (DBテーブル) FROM TABLE(内部テーブル).
INSERT INTO (DBテーブル) FROM TABLE (内部テーブル).
複数レコードを挿入する場合も、基本的な概念は同じです。
指定した内部テーブルに格納されているレコードを、DBテーブルに挿入します。
単一の場合は、オプションに「VALUE+構造名」を指定しましたが、複数の場合は「FROM+内部テーブル」となる点が異なります。
内部テーブルと構造の違いを詳しく学びたい方は、こちらの記事をご覧ください。
挿入するレコードが複数の場合、全てのレコード処理が正常に終了した場合にはリターンコードは0で返ってきます。ただし、1つでも正常に処理されなかった場合、処理が無かったことになります(処理が全件破棄されます)。
もし、正常に挿入できた分だけはそのまま破棄しないでほしい!という場合は以下のオプションを付けることで可能になります。
ACCEPTING DUPLICATE KEYSオプション
INSERT INTO (テーブル名) FROM TABLE(内部テーブル名)ACCEPTING DUPLICATE KEYS.
INSERT INTO (テーブル名) FROM TABLE (内部テーブル名) ACCEPTING DUPLICATE KEYS.
「ACCEPTING DUPLICATE KEYSオプション」を指定した場合、全ての操作が破棄されるのではなく、正常に終了したレコードはそのままデータベースに挿入される形になります。正常に挿入が行われたレコードの数は、システム項目「SY-DBCNT」にセットされます。
通常、内部テーブルからレコード挿入する場合には、ACCEPTING DUPLICATE KEYSオプションを利用することが推奨されます。
内部テーブルへのレコード挿入(単一レコード)
INSERT (構造) INTO TABLE (内部テーブル) .
INSERT (構造) INTO TABLE (内部テーブル) .
内部テーブルへ挿入する場合は、APPEND命令と似たような形をとります。
特に何もオプションを指定しない場合、APPEND命令と全く同じで内部テーブルの最後の行への挿入が行われます。もし、挿入する行を指定したい場合は「INDEXオプション」を利用します。
INDEXオプション
INSERT (構造) INTO TABLE (内部テーブル) INDEX (インデックス).
INSERT (構造) INTO TABLE (内部テーブル) INDEX (インデックス).
INDEXとは簡単に言えば、行番号です。
「INDEX 1」とすれば、内部テーブルの先頭にレコードが挿入されます。
内部テーブルへのレコード挿入(複数レコード)
INSERT LINES OF (内部テーブル) INTO TABLE (内部テーブル) .
INSERT LINES OF (内部テーブル) INTO TABLE (内部テーブル) .
単一レコードの場合との違いは、INSERTの直後に内部テーブルであることを示す「LINES OF」を記述する点です。それ以外の動きは、全く同じです。
INSERT命令は、追加する対象(内部テーブル/実テーブル)で書き方が変わり、また追加するレコードの数に応じてもさらに記述方法が分岐します。
この点、初心者の方ほど特に混乱しがちになってしまう部分なので、何度も復習するようにしておきましょう。
SAP / ABAPを1から学習したい方は
初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!