「カーソル」を理解する:「データベーススペシャリスト試験」戦略的学習のススメ(20)(1/2 ページ)
あの“津崎さん”も保有する難関資格「データベーススペシャリスト」。本企画では、データベーススペシャリスト試験 午前/午後試験対策のための「基礎知識」を抜粋してお届けします。今回は、「SQLにおけるカーソルの基礎」を解説します。
書籍の中から有用な技術情報をピックアップして紹介する本シリーズ。今回は、秀和システム発行の書籍ポケットスタディ データベーススペシャリスト [第2版](2015年12月22日発行)』からの抜粋です。
ご注意:本稿は、著者及び出版社の許可を得て、そのまま転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。
※編集部注:前回記事「SQLで「ロール作成と付与」を行う」はこちら
カーソル
出題頻度 午前II:●●- 午後I:●-- 午後II:●--
●--:過去14年間での過去問出題数が1〜9回
●●-:過去14年間での過去問出題数が10〜19回
●●●:過去14年間での過去問出題数が20回以上
Key Word
●カーソルを利用した処理の流れ、DECLARE、OPEN、FETCH、WHERE CURRENT OF 〜、CLOSE
カーソルを利用した処理の流れ
これまで説明したSQL文では、データを更新する際にUPDATE文を利用し、その中でWHERE句に条件を設定し、この条件に該当するデータを一括更新するというものでした。
カーソルを利用した処理では、まずカーソル(最初に取り出すSELECT文)を定義し、取り出した表についてループ処理で1行ずつ条件を判定し、条件に応じてデータを更新することができます。
カーソルを利用した処理の基本構文
カーソルを利用した処理の全体像は以下の通りです。午前問題では「DECLARE カーソル名 CURSOR FOR」や「WHERE CURRENT OFカーソル名」の穴埋めをさせる問題が非常によく出題されます。
<1>カーソルの宣言 | DECLARE カーソル名 CURSOR FOR (SELECT 文) |
---|---|
<2>カーソルを開く | OPEN カーソル名 |
<3>データの取得 | FETCH NEXT FROM カーソル名 INTO 変数リスト |
<4>ループ処理の実行 | WHILE 条件式 BEGIN 〜処理内容〜 WHERE CURRENT OF カーソル名 END |
<5>カーソルを閉じる | CLOSE カーソル名 |
<1>カーソルの宣言
最初に、処理対象のデータ抽出するSELECT文を指定します。ここではカーソル“csr”を定義すると同時にSELECT文を割り当てています。
DECLARE csr CURSOR FOR SELECT 物品名, 在庫数, 基準在庫数, 緊急発注数 FROM 在庫
<2>カーソルを開く
次にカーソルを開きます。割り当てたSELECT文が実行されます。
OPEN csr
<3>データの取得
SELECT文が実行した結果の表からデータを1行取得し、変数リスト(ここでは物品名、在庫数、基準在庫数、緊急発注数という4つの変数)にデータを代入します。変数リストに代入することで、条件分岐の判定などに利用できるようになります。
FETCH NEXT FROM csr INTO :物品名, :在庫数, :基準在庫数, :緊急発注数
データベース分野では、データを1行ずつ取得することを「FETCHする」といいます。「FETCH NEXT FROM カーソル名 INTO 変数リスト」は、英語の意味通り「次の行のデータを取得する」という意味ですが、最初の1回目に限り「1行目のデータを取得する」という意味になります。
<4>ループ処理の実行
ここで出てくるFETCH_STATUSはグローバル変数(明示的に定義しなくても自動的に定義されている変数)であり、最後に実行したFETCH文の結果(行を取り出せた:0、失敗した:1、取り出すデータがなかった:2)が格納されます。よって、ループ条件の「:FETCH_STATUS = 0」は「データが取り出せた場合」という意味になります(これは決まり文句です)。
UPDATE文には、「WHERE CURRENT OF カーソル名」という条件がありますが、これは「FETCHした行について(実行する)」という意味になります。
最後に、次の行のデータをFETCHし、ループ内の処理が終わります。
WHILE :FETCH_STATUS = 0 BEGIN UPDATE 納品物一覧 SET :緊急発注数=:基準在庫数-:在庫数 WHERE CURRENT OF csr FETCH NEXT FROM csr INTO :物品名, :在庫数, :基準在庫数, :緊急発注数 END
<5>カーソルを閉じる
ループ処理が終了した後、カーソルを閉じて処理は終了します。
CLOSE csr
FOR UPDATE OF による表のロック
前述した「<1>カーソルの宣言」を行うSELECT文の最後に「FOR UPDATE OF テーブル名」を付与すると、カーソルが指定するSELECT文を実行した状態で、該当のテーブルが他のSQL文によって更新されないようにロックをかけることができます。
例えば、SELECT文の実行結果いかんによって、UPDATEするかどうか条件分岐したい場合があったとします。並行して同時に複数の処理を実行させることを想定したとき、SELECT文の実行結果により条件判定した直後、UPDATE処理を行う前に、別の処理によりデータが変わってしまうと、本来UPDATEしないはずの処理でUPDATEしてしまう可能性があります。これを防ぐにはロックをかけ、トランザクションの独立性を保つ必要があります。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 春期試験の押さえどころを総ざらい!
本連載では、テクニカルエンジニア(データベース)試験に対応できる知識を確認していきます。多岐にわたる知識が問われる試験ですので、受験する方はもちろん、日常業務ではあまり使うことのない技術知識の確認にも役立ててください。 - データベーススペシャリスト試験(Database Specialist Examination)
ITエンジニアに必要な各種資格情報を解説する「@IT自分戦略研究所 資格辞典」。今回は、IPAが実施する情報処理技術者試験の「高度試験」9区分のうちの一つ「データベーススペシャリスト試験」を紹介する。 - 真のデータベースエンジニアを目指そう!
本連載は、ITシステム開発の現場でプログラミングやSQLのコーディングを行っているエンジニア(データベース利用者)が、データ管理者(DA)やデータベース管理者(DBA)へステップアップするための第一歩として有効な基礎知識を紹介する(編集局) - 【Oracle Database】忘れていませんか? 「アラートログ調査」に必要な、たった3つのキホン
データベース管理システムの運用でトラブルが発生したらどうするか。データベースサポートスペシャリストが現場目線の解決Tipsをお届けします。今回は基本編として「アラートログの調査で押さえるべき3つのポイント」を解説します。【Oracle Database 12c対応版】