【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文の書き方:サンプル多数あり」で解説しているのでぜひ参考にしてください。