2005.09.14

MARS

ASP.Net + ODP.Net で開発を行っています。
帳票を発行するのにCSVファイルを作成する必要があり、そのファイル作成のための情報を
Oracle の一時テーブル(セッション単位)に作成することにしました。
ところが、この方法で複数の端末から同時に別の条件で同じ帳票の発行処理を行ったところ、
全ての帳票の内容が同じになってしまいました。(ある一台の条件のみが反映されていました)
色々試してみたのですが、完全に永続テーブルのような動きになってしまっていました。
これでは一時テーブルを使用している意味がありません。

調べてみたところ、「MARS」というキーワードに行き当たりました。
これは「Multiple Active Result Sets」の略で、一つの接続で複数のクエリを実行できるもののようです。
接続オブジェクトの増加を抑止できるのですが、どうやら一時テーブルに対しても同じ接続オブジェクトを使用してしまうようです。
結局、同じ接続オブジェクトを使用したために一時テーブルが永続テーブルのように扱われてしまったようです。

ODP.Net ではMARS が使用できます。またADO.Net も2.0から使用できるようになるようです。
一時テーブルにデータを入れながら更新を行う、というようなこともやりたかったのですが、別の方法を採用することにしました。
便利なようですが、これまでのやり方が出来なくなってしまうというのも困ってしまいますね。
(実際には一時テーブルもきちんと使用できるのかもしれませんが)

というよりも、一時テーブルを使用して画面から更新を行う、というような処理はもうあまりやらないんですかね。

コメント (2)

まぁ、だいたい一時テーブルを使うタイミングはこういうときでしょう。

/*--------------------------------------------------------------------------*/
/* 関 数 名:CreateTemporaryTable */
/* 機能概要:テンポラリテーブルの作成 */
/* 引継情報: */
/* 戻 り 値:char * テンポラリテーブルの名前 */
/* 初版作成:2001.04.24 */
/* 改版履歴: */
/* 備  考:2次開発でホスト側の処理速度向上のために送信ファイルを */
/* 1次キー:端末番号 2次キー:仮受付No でソートするように */
/* 仕様が追加された。それを実現するために一時テーブルを使用する */
/*--------------------------------------------------------------------------*/

この時は、プログラム名と日時分秒をテーブル名にしてましたね。
ミリ秒単位で一時テーブルが作られるとアウトですが、
数分に一回の処理なので問題なかったです。

複数の端末から同じ処理が要求されるなら
テーブル名に端末番号などを入れると良いでしょうね。
乱数を使う手もあります。

補足
上の「一時テーブル」はオラクルの一時テーブルでななくて
パーマネントテーブルを一時テーブルのように使ってます。

「提供された機能で何とかする」という考え方もありますが
「機能がなければ機能を作る」ってのも好きですね。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

photo
takayama