ABAP/INSERT
データベーステーブルに対し、レコードを追加する命令。
概要 †
標準テーブルに対しては、BAPIやバッチインプットで行われるし、何より行ってはならないため、主にアドオンテーブルに対する操作として用いられる。
用法 †
とにかく挿入。
内部テーブルに対してはAPPENDを使い、実テーブルに対してはこちらを使う。
サンプルに出てくるが、構造を使うパターンと内部テーブルを使うパターンがある。
サンプル †
基本形式 †
INSERT INTO テーブル名 VALUES 構造
一件一件処理する場合は、こちら。
INSERT テーブル名 FROM 内部テーブル
恐らく多いであろう一括処理をするならば、こちら。
動的テーブル指定 †
INSERT (L_TABNAME)
似たようなアドオンテーブルがあり、登録先を切り分ける場合などに使用する。
・・・が、アドオンテーブル名からオブジェクト検索で出てこないなどの弊害があるので、余程のことがない限り実テーブル名を指定した方が無難。
切り分けなければならない程にアドオンテーブル数があるとしたら、はっきりいって設計がクソなのだと思う。
ACCEPTING DUPLICATE KEY †
ACCEPTING DUPLICATE KEY
内部テーブルを使用した一括処理で、一件でも登録済みデータがあるとショートダンプが発生してしまうため、よく指定される。
そうならないために事前の存在チェックを行ったりしたりすることもあるが、一括挿入してみて登録済みデータがある場合はロールバックを発行するか、いっそのこと洗い替えしてしまうか、設計次第。
中途半端に更新されても困る!というケースもあれば、少しのエラーのために多くを巻き添えにされても困る!という話もあるし。
CLIENT SPECIFIED †
CLIENT SPECIFIED
Open SQLにはクライアント処理というものがあり、クライアント依存テーブルにある項目のMANDTには態々値を指定しなくとも実行クライアントの値を自動的にセットするという動きがあるが、これをすっとばす。
対象データで指定したクライアント番号を使って挿入処理がなされ、他のクライアントのデータを追加する場合に使用する。
使用頻度は高くないが、INSERTだけでなくSELECTにもあるし、覚えておいて損はない命令。
その他 †
すべてのデータで挿入処理が成功した場合はSY-SUBRCに0、一件でも失敗した場合には4がセットされ、またSY=DBCNTに挿入した件数が格納される。
なお、この命令を発行してからCOMMIT WORKまたはROLLBACK WORKが発行されるまでデータベースがロックされる。逆に言えばコミットやロールバックの発行で初めてロックが解除されるため、正しく使用しなければデッドロック?の原因となる。
コメントはありません。 Comments/ABAP/INSERT?