e-learning、オラクル研修、LMS(学習管理システム)のiStudy

e-learning、オラクル研修、LMS(学習管理システム)のiStudy

第91回 「一時表の利用によるプログラミングの簡素化(1)」

2014.03.27

こんにちは。インストラクターの蓑島です。

すっかり春になりました。ここ東京でも桜が開花いたしました。桜前線が急北上ですね。

今回は「一時表」というちょっとした機能をご紹介します。
使い方によってはプログラミングの簡素化に大変役に立ちますので、皆さんの業務に役立てば幸いです。

まず「一時表」というのは、普通のデータベースの表のように、データベース上のオブジェクトです。したがってPL/SQLプログラムとは無関係に存在します。
「一時」という名前が付いていますが、表の存在そのものは永続的です。よって勝手に表そのものが消えることはありません。
ではなにが一時的かというと、表の中のデータが一時的なのです。
つまり、表にデータをINSERTしたり、UPDATEしたりしても、セッションが終了すれば、データは消えてしまいます。
そして通常は、セッションが終了するときだけでなく、トランザクションが「COMMIT」してもデータは消えます。
つまり、デフォルトではトランザクションの間だけデータが存在します。トランザクションが終わるとデータは消えるのです。ただし、指定によりトランザクションがCOMMITしてもデータが消えない一時表を作成することができますが、その場合でも、セッションが終了すれば必ずデータは消えます。
つまり、どんな場合でも、一時表のデータはセッションが終われば消えます。

また、一時表のデータのもう一つの重要な特徴は、その中のデータはセッション固有であり、他のセッションからは参照されることがないという点です。
例えば、COMMITしてもデータが消えない一時表を作成して、その表にデータをINSERTしてCOMMITしたとします。通常はCOMMITすると、そのデータは他のセッションから参照可能となりますが、一時表のデータはそのような場合でも他のセッションから参照できないのです。
つまり、一時表を利用するセッションは、その表には自分がINSERTしたデータのみが存在すると考えてかまわないわけです。

一時表の利用例として以下の二つのケースがあると思います。

1. プログラミングで一時的なデータを生成する必要があるとき
2. 複雑な配列(コレクション)の操作が必要なとき

まず、「1. プログラミングで一時的なデータを生成する必要があるとき」について解説します。
プログラムの処理ロジックによっては一時的なデータを生成してそれを使ってプログラム処理をしたい場合があります。
そのようなときは一時表が最適です。
一時表を使えば、その表には自分がINSERTしたデータのみが格納されていると考えることができます。
普通の表であれば、自分がINSERTしたデータと他者がINSERTしたデータとが混在する可能性がありますので、データを区別してSELECTする必要がありますが、一時表であればその区別が不要です。
つまり、アプリケーションのロジックを簡素にできます。また、普通の表を一時表のように使うのであれば、後始末として自分がINSERTしたデータを最後にDELETEする必要がありますが、一時表であればそのような後始末は不要となります。

私が実際に経験した事例では、複数の表をもとにした単純なエクセルのような画面を作るアプリの改善がありました。
そのデータは複数の表を結合した問い合わせでは生成できないものでした。もともと結合を想定していない複数の表かつ画面の使い方も単純な結合イメージではなかったのです。

そこで、その画面(エクセルのような表形式)イメージそのものの一時表を作り、ストアドプロシージャで、その一時表のデータをINSERTやUPDATEで生成し、そのデータを単純にSELECTした結果をアプリの画面に貼り付けるという方法をとりました。この方法により、ロジックの大半がPL/SQLのストアドプロシージャ側となり、アプリそのもののロジックはたいへんシンプルになりました。
また、アプリから何度もSQLを発行しているわけではなく、ストアドプロシージャを1回コールして、一時表をSELECTするだけなので、ネットワークの回数を大幅に抑えることができパフォーマンスアップにもつながりました。
そのシステムはアプリケーションサーバのような中間層がなく、C/S型だったのでネットワークの影響が大きかったのです。

次に、「2. 複雑な配列(コレクション)の操作が必要なとき」について説明します。
例えば、キー以外で配列データを検索したい場合、PL/SQL言語でロジックを記述しなければなりません。
しかし、配列の代わりに一時表を使っているのであれば、SQL文が使用できますので、配列データの検索なども簡単にできます。
このように一言でいえば、配列の操作ではSQL文は使用できませんが、一時表であればSQL文が使用できるメリットがあります。単に、データを格納してキーを指定してデータを取り出すだけのニーズであればわざわざ一時表を使うメリットはありません。
しかし、配列の操作で複雑なロジックを記述しなければいけないような状況であれば、いっそ配列の代わりに一時表を使う方がよりよい選択かもしれません。ただしアプリの都合だけでそのような一時表を作成すると、一時表の数が増えてしまいますので、汎用的なレイアウトの一時表をつかうような工夫をすればいいと思います。

いかがでしょうか。一時表の特徴と活用シーンがイメージできたのではないでしょうか。
使い方によってはアプリケーションのロジックを簡素できます。

では次回、一時表を作成してその特徴と動きを確認してみましょう。

先頭へ戻る