2019年9月18日データベースで単純なクエリを書くだけでは解決できないような処理をしたいときがあります。何かと面倒なことも多いですよね。そんなときは、もしかするとカーソルを使うと解決できるかもしれません。まとめある程度SQLを書けるようになってくると、少し複雑な処理をしたくなってきます。一行一行取り出して、値によって処理を分岐させたり、テーブルに挿入したり更新したり・・。そんなときは、カーソルを使うと思い通りの処理ができるようになるかもしれません。文を使って抽出されたレコードを一行ずつフェッチして、複雑な処理をしたい場合に有効です。文を駆使しても記述できないような内容だと思います。代用できないかどうか熟考する必要があると思います。Serverでカーソルを利用する場合は、次のような順序になります。変数リストを宣言カーソルを宣言カーソルを開くレコードをフェッチしてループ処理カーソルを閉じて、リソースを開放するカーソルで使用する変数を宣言カーソルでフェッチしたフィールドの値を収める変数を宣言します。変数は、フェッチされるフィールドの分だけ必要になります。フィールドの型に合わせて変数の型を定義しています。次にカーソルを宣言します。抽出されるフィールドが先程の変数に対応しています。inventoryカーソルを開くカーソルを利用するには、まずカーソルをオープンします。間だけループさせます。フェッチされたフィールドは、最初に宣言した変数に代入されます。して無限ループを作成するパターンは以下のようになります。ループの中に入ります。ここに処理をENDカーソルを閉じてリソースを開放するカーソルを使った処理が完了したら、忘れないようにカーソルをクローズし、カーソルのリソースを開放します。実際のカーソルの処理では、途中でエラーが発生して中断してしまうことがあります。その時、カーソルが閉じられずに残ってしまうので、エラーが発生してもカーソルを閉じ忘れることがないように処理する必要があります。エラーをキャッチカーソルでの処理中は、エラーが発生することがあるかもしれません。構文にてエラーに対する処理を行います。構文を入れると次のようになります。文に処理が移りますので、そちらで忘れずにカーソルを閉じる処理を記述します。この例のようにすると、エラー発生時に、エラーの内容等を表示することもなく終了してしまうので、実際には発生したエラーに応じて何らかの処理をすることになると思います。単純にエラーの内容を表示させる場合は次のようにしてエラーの内容を表示させることができます。データの一貫性を保つまた、エラー発生時、データのの整合性が保つために、トランザクションを使って処理することも多いと思います。エラーを補足した場合は、トランザクションをロールバックするようにします。実行してしまいエラーになります。ここまでを踏まえて、コードを完成させると以下のようになります。TRANSACTIONなんだか複雑に見えますが、カーソル処理を実際に行う際にはこういったエラー発生時の処理は必須だと思います。まとめRobert-Owen-WahlによるPixabayからの画像このようにカーソルを使うと、フェッチしたレコードごとに判断して処理させることが可能です。パフォーマンスはあまり良くないとも聞くので、カーソルを使わずに実現できないかをよく吟味して使用してください。コメントをキャンセルメールアドレスが公開されることはありません。名前メールアドレスウェブサイトご意見、ご感想をお願いします。