C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: ストアドプロシジャーの途中経過の進捗表示


(過去ログ 60 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■34533 / inTopicNo.1)  ストアドプロシジャーの途中経過の進捗表示
  
□投稿者/ やじゅ (966回)-(2009/03/31(Tue) 22:49:44)
やじゅ さんの Web サイト

分類:[.NET 全般] 

2009/04/01(Wed) 19:59:59 編集(投稿者)
2009/04/01(Wed) 01:06:18 編集(投稿者)

■質問内容
ストアドプロシジャー処理中に途中経過情報(件数とキー)を更新した一時表テーブルを、
クライアントPC上でタイマー等を使い、一時表テーブルを参照してプログレスバーで
進捗情報を表示しようとしています。

ですが、ストアドプロシジャー処理中の為か、一時表テーブルを参照しよう
としても応答がありません。(処理が終われば、応答が返ってきます。)

呼出しプログラムでのストアドプロシジャー処理中に、他のテーブルは
参照することは、そもそも無理なのでしょうか?

他に進捗状況をクライアントPC上に表示する方法があれば、ご教示ください。


■環境
OS : Windows XP Professional SP2 VB2005 ODP.NET 10.2
DataBase : Oracle 10.2

※分類に迷ったのですが、設計/仕様としました。
→原因的にいえば、「.NET 全般」に変更しておきます。

追記:
画面から抽出条件を入力→最大件数取得→ストアドプロシジャーをコール
一定間隔で、一時表テーブルを参照している
ストアドプロシジャーは現在マルチスレッド(BackgroundWorker)で動作

ストアドプロシジャーでは現状件数が少ないためテスト的にdbms_lock.sleep(1)
をループ内でセット


案:
ファイル出力とかかなー
クエリ変更通知 OracleDependencyクラス たぶんダメかな
ストアドだけ別プロセスとか 別プロセスなら参照できそうかな 一時表じゃダメか
引用返信 編集キー/
■34544 / inTopicNo.2)  Re[1]: ストアドプロシジャーの途中経過の進捗表示
□投稿者/ まどか (607回)-(2009/04/01(Wed) 01:57:03)
No34533 (やじゅ さん) に返信
> ストアドプロシジャーは現在マルチスレッド(BackgroundWorker)で動作

ミドルウェア側の入り口が同時要求に対応していないと
プログラム側がいくらマルチスレッド化しても無理なんじゃないかと。
結局、一つの入り口に対して一時テーブルを参照しにいって待たされているんじゃないでしょうか。
もうひとつコネクション作ったらうまくいくとか。。。
引用返信 編集キー/
■34545 / inTopicNo.3)  Re[1]: ストアドプロシジャーの途中経過の進捗表示
□投稿者/ はつね (983回)-(2009/04/01(Wed) 09:29:29)
はつね さんの Web サイト
No34533 (やじゅ さん) に返信
> ストアドプロシジャー処理中に途中経過情報(件数とキー)を更新した一時表テーブルを、
> クライアントPC上でタイマー等を使い、一時表テーブルを参照してプログレスバーで
> 進捗情報を表示しようとしています。

一次表テーブルよりもAQあたりに経過件数を突っ込んであげてそれをクライアント側で
定期的にDEQUEUEする方がよくないですか?

トランザクション絡んでくるならば、なんらかの方法で別セッションで投入するとかし
てデータトランザクションとは別にするとかじゃないとcommitするまで取り出せなかっ
たりするんじゃないでしょうか。

引用返信 編集キー/
■34547 / inTopicNo.4)  Re[2]: ストアドプロシジャーの途中経過の進捗表示
□投稿者/ なちゃ (261回)-(2009/04/01(Wed) 09:48:47)
一時表って同一セッションからしかアクセスできないんじゃないでしょうか?
何かオプションとかあるのかまでは知りませんが。
同一コネクションで並列コマンド実行は多分できないと思うので、
別にテーブル用意した方が無難と思います。
ひょっとしたらコネクションを明示的にセッションに参加させる方法があるのかも知れませんが。
引用返信 編集キー/
■34550 / inTopicNo.5)  Re[3]: ストアドプロシジャーの途中経過の進捗表示
□投稿者/ かたぎり (2回)-(2009/04/01(Wed) 10:49:52)
一時表って、同一セッションのみ有効だと思う。
SQLServerだとグローバルアクセス公開ができるけど、Oracleはどうかしらん?

テーブルをCreateして、仕事終わったらDrop、で作っておいて、
別スレッドやプロセスからもアクセスできるようにした方が簡単だと思う。
更新が頻繁なら、トランザクション分離できれば尚良いけど……
引用返信 編集キー/
■34554 / inTopicNo.6)  Re[4]: ストアドプロシジャーの途中経過の進捗表示
□投稿者/ はつね (984回)-(2009/04/01(Wed) 12:28:39)
はつね さんの Web サイト
No34550 (かたぎり さん) に返信
> SQLServerだとグローバルアクセス公開ができるけど、Oracleはどうかしらん?

OracleだとSQL Serverのグローバル一時テーブルに相当するものはないですね。
同一セッション(もしくは同一トランザクション)でのみ共通利用できて、別セッションでも同じ構造の一時テーブルを使えるけれどセッション間でデータの受け渡しは不可能です。

非互換の部分とかどうやって同じようにするかについては、いつも以下の書籍を参考にしています。
http://www.amazon.co.jp/dp/4839922780/

引用返信 編集キー/
■34555 / inTopicNo.7)  Re[4]: ストアドプロシジャーの途中経過の進捗表示
□投稿者/ やじゅ (967回)-(2009/04/01(Wed) 12:33:23)
やじゅ さんの Web サイト
2009/04/01(Wed) 19:58:05 編集(投稿者)
2009/04/01(Wed) 12:34:37 編集(投稿者)

アドバイス&回答して頂いた方々、ありがとうございます。

ヒントを頂き、とりあえず、目的は達成することは出来ました。

>ストアドプロシジャー処理中の為か、一時表テーブルを参照しよう
>としても応答がありません。(処理が終われば、応答が返ってきます。)
に関しては、私のプロジェクトの共通ライブラリ側に何か問題があるようで、
別途、参照ルーチンを作成したところ参照することが出来ました。
その原因が分かりしだい、また追記します。

-------------------------------------------------
追記:
原因としては、共通ライブラリ側には特に問題なく
同一コネクションであったことが原因のようです。
参照用に別途コネクションを分ければ参照できます。
-------------------------------------------------

また、同一トランザクション内では、参照しても同じ値しか返ってこない
ようなので、自立型トランザクション(PRAGMA AUTONOMOUS_TRANSACTION;)を
用いて、更新するようにしました。これにより、一時表テーブルはやめました。


また、何か情報を得られたらご報告します。ありがとうざいました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -