平成26年度 春期 データベーススペシャリスト試験 午後Ⅰ
http://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2014h26_1/2014h26h_db_pm1_qs.pdf
問2
設問3 〔会議室予約システムの改良結果〕について,(1),(2)に答えよ。
(1) 図7中の t に入れる適切な字句を答えよ。
〔会議室予約システムについての改良結果〕
図5の⑤~⑦の実行時に,ディスク容量不足などのエラーが発生して,予約処理のトランザクションが中断してしまうと問題が生じることが分かったので,〔会議室予約システムについての改良案〕は不採用とし,”会議室予約”テーブルを図6のように変更した。
図6 変更した”会議室予約”テーブルのテーブル構造
図7 予約処理内容の改良結果
だめだ、やっぱりデータイメージが湧いてこないので、サンプルを作ってみる。
○初期値
①のSELECT文は、予約が存在するかどうかを調べるもの
t と 比較しているのは、PRIODCOUNT( :hv2,:hv3)
なるほど、つまり指定の予約開始時刻と予約終了時刻から、コマ数を求め、
会議室の空きコマ数(会議室予約テーブルの予約済フラグが'N'であるレコード件数)
と同じになるかどうかで判定している。それをHAVINGの条件とすることで、
取得結果の有無になるのだ。
例:Bさんの場合
11時00分から13時00分まで4コマであるが、SELECTのGROUP BYの結果では、
2コマとなって、HAVING条件が一致しない。つまり「予約失敗」という判定とするのだ。
【回答】
t : COUNT(*)
http://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2014h26_1/2014h26h_db_pm1_qs.pdf
問2
設問3 〔会議室予約システムの改良結果〕について,(1),(2)に答えよ。
(1) 図7中の t に入れる適切な字句を答えよ。
〔会議室予約システムについての改良結果〕
図5の⑤~⑦の実行時に,ディスク容量不足などのエラーが発生して,予約処理のトランザクションが中断してしまうと問題が生じることが分かったので,〔会議室予約システムについての改良案〕は不採用とし,”会議室予約”テーブルを図6のように変更した。
会議室予約(会議室番号,予約日,予約開始時刻,予約終了時刻,社員番号,予約済フラグ)
図6 変更した”会議室予約”テーブルのテーブル構造
会議室予約を行う予約単位をコマと呼び,1コマは30分単位とする。図6の”会議室予約”
テーブルでは,各コマを0時00分から30分間隔で設定する。予約受付対象の全てのコマは
あらかじめ登録しておく。該当するコマが予約済みか否かを予約済フラグで識別し,
予約済みであれば’Y’,予約済みでなければ’N’とする。例えば,10時00分~11時30分を
予約済みとする場合,予約開始時刻が10時00分,10時30分,11時00分の3コマの予約済
フラグを’Y’に更新する。
変更した”会議室予約”テーブルを使用して,予約処理内容を図7のように変更した。
なお,図7中のホスト変数のcntはコマ数を表す。また,図7中のユーザ定義関数について
次に示す。
・PERIODSTART関数は,コマの終了時刻を与えて,コマの開始時刻を求めるユーザ定義
関数とする。例えば,11時30分を指定した場合,11時00分が返却される。
・PERIODCOUNT関数は,開始時刻と終了時刻を与えて,含まれるコマ数を求めるユーザ
定義関数とする。例えば,10時00分と11時30分を指定した場合,3が返却される。
・PERIODNEXT関数は,指定の時刻とコマ数を与えて,指定の時刻からコマ数だけ後に
ずらしたコマの開始時刻を求めるユーザ定義関数とする。例えば,10時00分とコマ数2を
指定した場合,11時00分が返却される。
① | 指定された条件に重なる予約が入っていないことをSELECT文で確認する。結果行がない場合,予約失敗として③に進む。結果行がある場合,②に進む。 ’Y’に更新する。更新できたか否かを記憶する。 SELECT 会議室番号 FROM 会議室予約 WHERE 会議室番号 = :hv4 AND 予約日 = :hv1 AND 予約開始時刻 BETWEEN :hv2 AND PERIODSTART(:hv3) AND 予約済フラグ = 'N' GROUP BY 会議室番号 HAVING t = PERIODCOUNT(:hv2,:hv3) |
② | 指定された条件の予約のため UPDATE文で更新処理を該当コマ数分繰り返す(cntは0から該当コマ数-1まで)。全て正常に更新できた場合,予約成功としてコミットし、③に進む。繰り返した中で,1会でも更新行がなかった場合,予約失敗としてロールバックし,③に進む。UPDATE 会議室予約 SET 予約済フラグ = 'Y', 社員番号 = :hv5 WHERE 会議室番号 = :hv4 AND 予約日 = :hv1 AND 予約開始時刻 = PERIODNEXT(:hv2, :cnt) AND 予約済フラグ = 'N' |
③ | 予約の成否を通知する。 |
図7 予約処理内容の改良結果
だめだ、やっぱりデータイメージが湧いてこないので、サンプルを作ってみる。
○初期値
… | 予約開始時刻 | … | 予約済フラグ |
---|---|---|---|
… | 09:00 | … | N |
… | 09:30 | … | N |
… | 10:00 | … | N |
… | 10:30 | … | N |
… | 11:00 | … | N |
… | 11:30 | … | N |
… | 12:00 | … | N |
… | 12:30 | … | N |
… | 13:00 | … | N |
○Aさんが11時00分~12時00分を予約
… | 予約開始時刻 | … | 予約済フラグ |
---|---|---|---|
… | 09:00 | … | N |
… | 09:30 | … | N |
… | 10:00 | … | N |
… | 10:30 | … | N |
… | 11:00 | … | Y |
… | 11:30 | … | Y |
… | 12:00 | … | N |
… | 12:30 | … | N |
… | 13:00 | … | N |
○Bさんが11時00分~13時00分を予約しようとして判定するのは?
… | 予約開始時刻 | … | 予約済フラグ |
---|---|---|---|
… | 09:00 | … | N |
… | 09:30 | … | N |
… | 10:00 | … | N |
… | 10:30 | … | N |
… | 11:00 | … | Y ? |
… | 11:30 | … | Y ? |
… | 12:00 | … | N ? |
… | 12:30 | … | N ? |
… | 13:00 | … | N |
①のSELECT文は、予約が存在するかどうかを調べるもの
t と 比較しているのは、PRIODCOUNT( :hv2,:hv3)
なるほど、つまり指定の予約開始時刻と予約終了時刻から、コマ数を求め、
会議室の空きコマ数(会議室予約テーブルの予約済フラグが'N'であるレコード件数)
と同じになるかどうかで判定している。それをHAVINGの条件とすることで、
取得結果の有無になるのだ。
例:Bさんの場合
11時00分から13時00分まで4コマであるが、SELECTのGROUP BYの結果では、
2コマとなって、HAVING条件が一致しない。つまり「予約失敗」という判定とするのだ。
【回答】
t : COUNT(*)
コメント
コメントを投稿