PostgreSQL: カーソル操作の基本


PostgreSQL の PLpg/SQL での基本のカーソル操作についてまとめました。

環境

  • psql 9.6
  • PostgreSQL 9.3

カーソル

ざっくりと説明すると、 SELECT で取得した全レコードそれぞれについて逐次処理をしたい場合に使用するものです。

カーソルを定義して使う

カーソルは書き方がいくつかあるのですが、まずは基本から。 Oracle では 明示カーソル と呼ばれます。 PostgreSQL のドキュメントでは Bound Cursor と書かれています。

CURSOR でカーソルを定義して、 RECORD型の変数を用意しておきます。 LOOP を使用して、 SELECT の結果全行に対して処理を行います。

CURSOR の後にある FORIS でも可です。 公式ドキュメントには FOR の記述しかありませんが、 IS に変更しても動きます。

カーソルを開き、クエリ結果の行を変数(ここではCR)に入れて全行の処理を行います。 カーソルが最終行まで処理をしたら
EXIT でループを抜けるようにしています。 最後、開いたカーソルは閉じておきます。

EXIT のところは IF を使って条件分岐していますが、 EXIT を実行したいだけなら もっと短く書くこともできます。 EXIT WHEN NOT FOUND; という行を入れます。

また、 FETCH のタイミングが単純ですから、もっと短縮して書くことができます。

この場合、レコードを格納する変数 CR はループ内でしか使えません。

カーソルでパラメータを使う

カーソルは、プログラミング言語でいう関数のように、引数をとることができます。

カーソルを宣言せずに使う

カーソルの応用編といってもいいと思います。 私はあまり使いません。 Oracle では 暗黙カーソル と呼ばれます。

カーソル変数を宣言していません。 レコードの変数は宣言が必要です。 (Oracle PL/SQL では レコードの変数は宣言しなくてもよかったですね。)