【SQL】INSERTしたレコードが0件でもエラーにならない
このページでは、ORACLEデータベースのSQLで、INSERT文を実行してとき、登録されたレコード件数の結果が0件の場合について、解説していきます。
INSERT文のサンプルは↓で多数紹介していますので参考にしてください。
>>【SQL】INSERT文の書き方:サンプル多数あり
INSERTしたレコードが0件でも正常終了する
結論から言うと、テーブルにINSERTしたレコードの結果が0件でも、SQLは正常終了します。
エラーや警告のメッセージは一切出力されません。プログラムを始めたときはびっくりしますが、SQL的に問題なければ正常に終了します。
仮に、プログラムで、ある表からレコードをSELECTして、別の表へINSERTするようなSQLを実行した時も同じです。
SELECT文のWHERE句の条件が間違っていて取得結果が0件でも、SQL自体は正常に終了します。
プログラムもSQL自体が正常終了しているので、滞りなく動き続けることもありますが、後々になって、データが登録されていなかったなど、トラブルの原因にもなります。
INSERTした結果が0件のときの対処方法
INSERTした結果が0件だと困る場合の対処方法を少し紹介します。
例えば、INSERTした結果の件数を確認して、0件の場合はアラートを出力したり、メールを飛ばす機能を構築するのも1つです。
後続の処理が実行されるとまずいようなバッチ処理の場合では、エクセプションをスローして、意図的にABENDさせることも1つです。
そもそもINSERTする前に、登録の対象となるデータが存在するのか、事前にチェックすることも有効です。
といった具合に、システムやプログラムの仕様や稼働条件に合わせて、対策を講じると0件で処理されるようなトラブルを回避することもできます。
INSERT結果が0件でもSQLが遅いことがあります
INSERTしたレコード件数が0件なのに、数時間もSQLが実行されることがあります。
例えば、INSERT-SELECT~といった形のSQLの場合です。
SELECT以下の条件に合致するレコードの探索に時間を要し、処理時間が遅くなることもあります。
これについては、SELECT文のSQLをチューニングしてレコードの探索時間の短縮を図る必要があります。
SELECT文のチューニングについては「SELECT文のSQLチューニング方法まとめ」で詳しく解説しているのでぜひ参考にしてください。
まとめ
INSERT文は、レコードの登録結果が0件でも、正常終了します。エラーメッセージやアラートは一切出力されません。
登録件数が0件だと困るプログラムは、0件の場合に、アラートや意図的に例外を投げるなどして、処理を止めることも検討する必要があります。
この他にも、INSERT文の様々な書き方を解説しております。
詳しくは「【SQL】INSERT文の書き方:サンプル多数あり」で解説しているのでぜひ参考にしてください。