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

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

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

Re[4]: OracleのSQL発行でエラー


(過去ログ 131 を表示中)

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

■77382 / inTopicNo.1)  OracleのSQL発行でエラー
  
□投稿者/ TTS (1回)-(2015/10/15(Thu) 19:00:13)

分類:[VB.NET/VB2005 以降] 

-----サーバ側-----
OS:WindowsServer2008R2
Oracle:11g
------------------------

-----クライアント側-----
OS:Windows7 Pro
Oracle:11g
開発言語:VB2005
------------------------

VB2005のADOにてOracleへ接続し下記のSQLを発行していますが、発行時に固まってしまいます。


Select 
  A.SYAIN_CD, 
  A.NAME, 
  A.SYOZOKU_CD, 
  B.SYOZOKU_NAME, 
  A.KINMU_CD, 
  C.KINMU_NAME
From
  SYAIN_DATA A,
  SYOZOKU_DATA B,
  KINMU_DATA C
WHERE
  A.SYAIN_CD = '123456789'
  And
  A.SYOZOKU_CD = B.SYOZOKU_CD(+)
  And
  A.KINMU_CD = C.KINMU_CD(+)

SYAIN_DATAテーブル:社員情報テーブル
SYOZOKU_DATAテーブル:所属情報テーブル
KINMU_DATAテーブル:勤務地情報テーブル


異なる社員のデータを検索する場合は正常に動作しますが、
とある社員のみ固まります。
(SQLPlusで発行すると正常に動作します。)
また、下記のようにSelectする項目(C.KINMU_NAME As KINMUNAME2)を増やせば、VB2005でも正常に動作します。

Select 
  A.SYAIN_CD, 
  A.NAME, 
  A.SYOZOKU_CD, 
  B.SYOZOKU_NAME, 
  A.KINMU_CD, 
  C.KINMU_NAME,
  C.KINMU_NAME As KINMUNAME2
From
  SYAIN_DATA A,
  SYOZOKU_DATA B,
  KINMU_DATA C
WHERE
  A.SYAIN_CD = '123456789'
  And
  A.SYOZOKU_CD = B.SYOZOKU_CD(+)
  And
  A.KINMU_CD = C.KINMU_CD(+)


原因が分からず悩んでおります。
御存知の方いらっしゃいましたら教えて頂けませんでしょうか?
宜しくお願いします。

引用返信 編集キー/
■77383 / inTopicNo.2)  Re[1]: OracleのSQL発行でエラー
□投稿者/ 魔界の仮面弁士 (529回)-(2015/10/15(Thu) 21:41:15)
No77382 (TTS さん) に返信
> 下記のようにSelectする項目(C.KINMU_NAME As KINMUNAME2)を増やせば、VB2005でも正常に動作します。

列名をすべて AS で付け直したり、SQL の構文に影響を与えない範囲で
空白や改行を加えることで、問題を回避できたことがあります。(10gR1でしたけれど)

その時は Oracle 側の問題だったため、Oracle サポートより
最新版のパッチを適用するように案内されて治まりました。

今回がそうであるかどうかは別問題ですが、
念のために問い合わせてみては如何でしょう?



> VB2005のADOにてOracleへ接続し

「VB2005のADOにてOracleへ接続」という点が気にかかります。
具体的にはどのライブラリで接続していますか?

 (1) "Interop.ADODB.dll"
 (2) "ADODB.dll"
 (3) "System.Data.OracleClient.dll"
 (4) "Oracle.DataAccess.dll"
 (5) 上記以外

1 および 2 は COM ベースである「ADO」ですが、
3 および 4 は マネージな「ADO.NET」です。


1 は、Visual Studio によって自動生成されるライブラリ。
2 は、Microsoft の署名の入った、プライマリ相互運用機能ライブラリ。
3 は、Microsoft 社による実装。(Oracle Client 8.1.7 以降が必要)
4 は、Oracle 社による実装。一般的には「ODP.NET」と呼ばれますね。


1 は、COM のタイプライブラリから自動生成されるライブラリであり、
通常は使うべきでは無いとされています。使うなら 2 ですね。
https://support.microsoft.com/ja-jp/kb/318559

ただし ADO は、そもそも COM ベースのものであるため、.NET からの利用は
パフォーマンス等の面で難があります。ADO.NET では使えない機能のために
ADO を使わざるを得ない場合を除き、一般的には ADO.NET を採用するべきです。
https://support.microsoft.com/ja-jp/kb/321415


ということで、3 か 4 が主要な選択肢となるはずです。
3 は ".NET Framework Data Provider for Oracle"
4 は "Oracle Data Provider for .NET" とも呼ばれますね。

ただし 3 は、.NET 4 以降で Obsolete すなわち非推奨扱いとなったため、
現在は避けられることが多いです。自分も 3 で作ってしまうことはありますが、
一般的には 4 を用いるべきでしょうね。
引用返信 編集キー/
■77394 / inTopicNo.3)  Re[2]: OracleのSQL発行でエラー
□投稿者/ TTS (2回)-(2015/10/16(Fri) 12:52:33)
魔界の仮面弁士様

返信ありがとうございます。

> 「VB2005のADOにてOracleへ接続」という点が気にかかります。
> 具体的にはどのライブラリで接続していますか?
>
>  (1) "Interop.ADODB.dll"
>  (2) "ADODB.dll"
>  (3) "System.Data.OracleClient.dll"
>  (4) "Oracle.DataAccess.dll"
>  (5) 上記以外

確認したところ(1)で接続しておりました。

> 一般的には 4 を用いるべきでしょうね。
(4)方法で試しても結果は変わらず、SQL発行処理でフリーズ?状態となります。

質問内容に不備があり実際の参照テーブル(KINMU_DATA)はリンクテーブルとなっております。

Select
A.SYAIN_CD,
A.NAME,
A.SYOZOKU_CD,
B.SYOZOKU_NAME,
A.KINMU_CD,
C.KINMU_NAME
From
SYAIN_DATA A,
SYOZOKU_DATA B,
KINMU_DATA@LINK_TABLE C
WHERE
A.SYAIN_CD = '123456789'
And
A.SYOZOKU_CD = B.SYOZOKU_CD(+)
And
A.KINMU_CD = C.KINMU_CD(+)

御面倒をお掛けしますが、宜しくお願い致します。
引用返信 編集キー/
■77395 / inTopicNo.4)  Re[3]: OracleのSQL発行でエラー
□投稿者/ 魔界の仮面弁士 (532回)-(2015/10/16(Fri) 13:39:45)
2015/10/16(Fri) 13:55:38 編集(投稿者)

No77394 (TTS さん) に返信
> SQL発行処理でフリーズ?状態となります。
VB 側が「固まって」いる間、Oracle 側はどうなっていますか?

単に時間がかかっているだけなのか、ロック解除待ちに陥っているのか、
実はセッションが切れているのに、それが検出されずに無限に待機して
いる状態なのかなどを調べてみてください。


たとえば、V$SESSION.STATUS が ACTIVE なのか、
V$SESSION.LOCKWAIT が NULL か否か。

STATUS が ACTIVE (SQL 実行中)だとしたら、処理している
V$SQLTEXT_WITH_NEWLINES の内容は予期しているものであるかなど。



>> (1) "Interop.ADODB.dll"
> 確認したところ(1)で接続しておりました。

・Microsoft OLE DB Provider for Oracle
・OLE DB Provider for Oracle

などを使う方法ですね。

本来、(1) はもっとも避けるべき組み合わせなので、
今後の見直しをお奨めします。最低でも (2) にしておきましょう。


> 4)方法で試しても結果は変わらず、
問題箇所の切り分けが必要そうなので、
Oracle のサポートに問い合わせることも検討してみてください。


> 質問内容に不備があり実際の参照テーブル(KINMU_DATA)はリンクテーブルとなっております。

リンクテーブルではなく、「データベースリンク」ですよね。

リンクテーブルは Jet/ACE (Microsoft Access) の用語です。
SQL Server なら「リンクサーバー」ですね。


データベース同士の文字コードは一致していますか?
ここが違っていると、特定の文字を含むデータの処理で
問題が発生するかもしれません。

それと、外部結合(いわゆる OUTER JOIN)を他のデータベースとの
接続に使った場合、適切なクエリプランが立てられずに、
有効なインデックスが使われなくなることで処理時間が増大したり、
あるいはロック粒度の拡大が生じるケースがあります。
未確認ですが、明示的なインデックスヒントで改善されたりはしませんか?
引用返信 編集キー/
■77396 / inTopicNo.5)  Re[4]: OracleのSQL発行でエラー
□投稿者/ TTS (3回)-(2015/10/16(Fri) 14:23:46)
魔界の仮面弁士様
返信ありがとうございます。

No77395 (魔界の仮面弁士 さん) に返信
> たとえば、V$SESSION.STATUS が ACTIVE なのか、
> V$SESSION.LOCKWAIT が NULL か否か。

STATUS=ACTIVE
LOCKWAIT=NULL

> STATUS が ACTIVE (SQL 実行中)だとしたら、処理している
> V$SQLTEXT_WITH_NEWLINES の内容は予期しているものであるかなど。

STATUS は ACTIVEでしたが、V$SESSION.SQL_IDを元に、V$SQLTEXT_WITH_NEWLINESを検索しましたが、
該当するデータがありませんでした。


> ・Microsoft OLE DB Provider for Oracle
> ・OLE DB Provider for Oracle
>
> などを使う方法ですね。
>
> 本来、(1) はもっとも避けるべき組み合わせなので、
> 今後の見直しをお奨めします。最低でも (2) にしておきましょう。
(1)は避けるべき方法・・・
ほぼ(1)で作成していました。
変更するように検討したいと思います。


> リンクテーブルではなく、「データベースリンク」ですよね。
データベースリンクの間違いでした。
申し訳ありません。

> データベース同士の文字コードは一致していますか?
JA16SJISTILDEで一致しておりました。

> 未確認ですが、明示的なインデックスヒントで改善されたりはしませんか?
確認してみます。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -