【入門編】 PL/pgSQLの例外処理 – PostgreSQL

こんにちは!データベースエンジニアのブログへようこそ。

皆さんは、プログラミングやSQLを書いていて「あ、ここでエラーが起きたらシステムが止まっちゃうな…」と不安になったことはありませんか?

PostgreSQLで複雑な処理を書くときに欠かせない「PL/pgSQL」。実はこれ、ただ命令を並べるだけじゃなくて、「もしもの時の備え」がめちゃくちゃ得意なんです。

今日は、初心者の方でも直感的にわかるように、PL/pgSQLでの「例外処理(エラー対応)」についてお話ししますね。

—

1. そもそも「例外処理」って何?

日常で例えるなら、「料理中のハプニング」を想像してみてください。

カレーを作っているとき、お鍋を火にかけている最中に「あ、カレールーがない!」と気づいたとします。そのとき、どうしますか?

  • 普通の状態: 堂々とルーを投入して完成!
  • 例外(トラブル): ルーがないことに気づく。ここでパニックになってキッチンを爆破(システム停止)させるのではなく、「近くのコンビニに走る」という解決策をとりますよね。

プログラムの世界でいう「例外処理」とは、まさにこの「ルーがないと気づいたときに、どうリカバリーするか」をあらかじめ決めておくことなんです。

—

2. まずは「RAISE文」でエラーを投げよう

エラーを扱う第一歩として、あえて「ここでエラーだよ!」と自分から叫ぶ方法があります。それが`RAISE`文です。

DO $$
BEGIN
— ここで何らかのチェックをする
IF 1 = 1 THEN
RAISE EXCEPTION ‘大変です!ルーがありません!’;
END IF;
END $$;

これを実行すると、PostgreSQLは「ギャー!」と叫んで処理をストップしてくれます。開発中に「ここまで処理が来たらおかしいぞ」という場所を見つけるための、いわば「注意喚起の看板」のようなものですね。

—

3. 「EXCEPTIONブロック」で守りを固める

ここからが本題です。エラーが起きてもシステムを止めず、賢く対処する方法。それが`BEGIN…EXCEPTION…END`ブロックです。

DO $$
BEGIN
— 失敗するかもしれない危険な処理
INSERT INTO recipes (name) VALUES (‘カレー’);

— もし何かが起きたらここに飛んでくる!
EXCEPTION
WHEN OTHERS THEN
— 失敗したときの「逃げ道(バックアップ処理)」
RAISE NOTICE ‘カレー作りは失敗しましたが、代わりにカップラーメンを食べます。’;
END $$;

このコードのポイント

  • BEGIN…END: 「ここからここまで、ちょっと注意して見ててね」というエリアです。
  • EXCEPTION: もしエリア内でトラブルが起きたら、それ以降の処理はスキップして、ここへジャンプします。
  • ロールバックの魔法: これが一番大事なポイントなのですが、`EXCEPTION`ブロック内でエラーが起きると、そのブロック内で行ったデータベースの変更(INSERTやUPDATEなど)は、なかったこと(ロールバック)になります。

「中途半端なデータだけ残って、あとで整合性が取れなくなる…」なんていう、データベースエンジニアが一番嫌う悪夢を、このブロックが自動的に防いでくれるんです。なんて頼もしいんでしょう!

—

まとめ:失敗を恐れず、守りを固めよう

データベースの運用において、「絶対にエラーが起きないコード」を書くのは不可能です。でも、「エラーが起きたときに、どう優雅に振る舞うか」を決めておくことはできます。

  • `RAISE`で問題を可視化する。
  • `EXCEPTION`で守りを固めて、データの整合性を守る。

これさえ覚えておけば、皆さんの書くSQLは一段とプロっぽく、そして安全なものになりますよ。

最初は少し難しく感じるかもしれませんが、まずは「もしもここで失敗したら…」と考えて、`EXCEPTION`を書いてみることから始めてみてくださいね。

また次回の記事でお会いしましょう!質問があればコメント欄までお気軽にどうぞ。

コメント

タイトルとURLをコピーしました