BEA ホーム | 製品 | dev2dev | support | askBEA
 ドキュメントのダウンロード   サイト マップ   Glossary 
検索

WebLogic Server FAQ 集

 Previous Next Contents PDF で侮ヲ  

FAQ: WebLogic jDriver for Oracle

Q. Oracle 8 で FOR UPDATE を使うと ORA-01002 エラーが発生するのはなぜですか。

A. Oracle 8 サーバでは、AUTOCOMMIT がオンの状態 (JDBC を使用する場合のデフォルト) で FOR UPDATE 文を使用すると「ORA-01002 フェッチ順序が無効です」というエラー メッセージが生成されます。この問題は、Solaris の Oracle 8.0 と 8.1、そして、Windows NT の Oracle 8.1 で起こることがわかっています。AUTOCOMMIT をオフにすれば、このエラーは起きなくなります。この問題は、Oracle 8 サーバの変更によるものなので、詳しい情報については Oracle のサポートに連絡してください。

Q. OCIW32.dll エラーの原因は何ですか。

A. Oracle 用 JDBC ドライバを使用すると、「The ordinal 40 could not be loaded in the dynamic link library OCIW32.dll.」というエラー メッセージが表示される場合があります。この問題は、システム ディレクトリにある OCIW32.DLL が旧バージョンであることが原因です。一部のプログラムは、実行時に使用するために、このファイルをシステム ディレクトリにインストールします。このファイルをシステム ディレクトリから削除すれば、このエラーは発生しなくなります。

Q. WebLogic jDriver for Oracle はどのトランザクション アイソレーション レベルをサポートしているのですか。

A. サーブレット アプリケーションは、Oracle Thin ドライバを使用して BLOB フィールドが含まれているデータベースにアクセスする場合があります。この場合、WebLogic jDriver for Oracle をインストールして使用するときに、同じコードが以下の例外によってエラーとなります。


com.roguewave.jdbtools.v2_0.LoginFailureException:
TRANSACTION_READ_UNCOMMITTED isolation level not allowed
The Stack Trace:
com.roguewave.jdbtools.v2_0.LoginFailureException:
TRANSACTION_READ_UNCOMMITTED isolation level not allowed
at
com.roguewave.jdbtools.v2_0.jdbc.JDBCServer.createConnection
(JDBCServer.java :46)
at com.roguewave.jdbtools.v2_0.ConnectionPool.getConnection_
(ConnectionPool.jav a:412)
at com.roguewave.jdbtools.v2_0.ConnectionPool.getConnection
(ConnectionPool.java :109)

コードで、Isolation_level を 1 に設定すると、RogueWave JDBCServer クラスを呼び出しています。Oracle Thin ドライバは問題なく動作しますが、WebLogic jDriver for Oracle ではエラーとなります。

WebLogic jDriver for Oracle では、以下のトランザクション アイソレーション レベルがサポートされています。

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

Oracle のマニュアルによると、Oracle DBMS では上の 2 つのアイソレーション レベルしかサポートされていません。他の JDBC ドライバと違い、WebLogic のドライバは、サポートされていないアイソレーション レベルを使用しようとした場合に例外を送出します。一部のドライバは、サポートされていないアイソレーション レベルを設定しようとした場合に、例外を生成することなく無視します。サポートされていないアイソレーション イベントの設定を Oracle Thin ドライバが無視するのかどうかテストすることをお勧めします。

Q. WebLogic jDriver for Oracle ドライバで Unicode コードセットを使用するにはどうするのですか。

A. Unicode コードセットを使用するには、以下のようにします。

  1. Oracle のインストール時に、適切なコードセットをインストールします。最初のインストール時にコードセットをインストールしなかった場合は、Oracle インストーラを再実行し、適切なコードセットをインストールする必要があります。

  2. JDBC ドライバを実行している環境で、NLS_LANG 変数を定義します。WebLogic Server を起動するシェルで、適切なコードセットを NLS_LANG に割り当てることで定義できます。

インターナショナライゼーションのサポートの詳細については、開発者ガイドを参照してください。Unicode の一般的な情報については、Unicode の Web サイトを参照してください。Unicode 言語の略称については、JavaSoft の Web サイトを参照してください。

Q. WebLogic jDriver for Oracle および接続プールと共に OS 認証を使用するにはどうすればよいですか。

A. OS 認証を接続プールで使用するということは、WebLogic Server を起動したユーザのユーザ ID を使用することになります。OS 認証は Windows および UNIX で利用できます。つまり、データベース セキュリティは WebLogic のセキュリティに厳密に依存します。したがって、WebLogic Server にクライアント接続してプールにアクセスできる場合は、データベースにアクセスできるということです。

Oracle ではプロセスのオーナを使用して、接続しようとしているユーザを判断するので、これは WebLogic jDriver for Oracle で実行できます。WebLogic JDBC の場合は、常に WebLogic Server を起動したユーザです。

この機能を使用するように Oracle のインスタンスを設定するには、DBA は以下の基本的な手順に従って操作する必要があります。詳しい手順については、Oracle のマニュアルを参照してください。

  1. 次の行を INIT[sid].ORA ファイルに追加します。
      OS_AUTHENT_PREFIX = OPS$

    文字列「OPS$」は、DBA の判断で使用してください。

  2. Oracle サーバに SYSTEM としてログインします。

  3. OPS$userid という名前のユーザを作成します。userid は、オペレーティング システムのログイン ID にしてください。このユーザには、CONNECT や RESOURCE といった標準的な特権を割り当てます。

  4. ユーザ ID を設定したら、ユーザ名プロパティとして「"/"」、パスワード プロパティとして「""」を指定して WebLogic jDriver for Oracle に接続できます。次に、dbping ユーティリティでこの接続をテストする例を示します。
 $ java utils.dbping ORACLE "/" "" myserver

次に、WebLogic jDriver for Oracle のコード例を示します。

  Properties props = new Properties();
props.put("user", "/");
props.put("password", "");
props.put("server", "myserver");

Class.forName("weblogic.jdbc.oci.Driver").newInstance();
Connection conn = myDriver.connect("jdbc:weblogic:oracle",
props);

  1. 管理者ガイド を使用して、接続プールの属性を設定します。次のコードは、WebLogic jDriver for Oracle を使用して JDBC 接続プールをコンフィグレーションする例です。
<JDBCConnectionPool 
Name="myPool"
Targets="myserver,server1"
DriverName="weblogic.jdbc.oci.Driver"
InitialCapacity="1"
     MaxCapacity="10"
CapacityIncrement="2"
Properties="databaseName=myOracleDB"

Q. ResultSet.getObject() ではどの型のオブジェクトが返されるのですか。

A. WebLogic jDriver for Oracle は、取り出したデータの精度を維持する Java オブジェクトを常に返します。WebLogic jDriver for Oracle は、getObject() メソッドで以下を返します。

たとえば、1.0000 の場合は Integer が返されます。123456789123.00000 のような値の場合は Long が返されます。小数部がゼロでない値の場合、その値の精度を Double で表すことができる場合は Double、それ以外の場合は BigDecimal が返されます。

Q. WebLogic Server で生成される Oracle データベース接続の数を制限するには、どうすればよいですか。

A. クライアントの要求に応じて WebLogic Server が生成する Oracle データベース接続の数を制限する場合は、接続プールを使用できます。接続プールを使用すると、複数の T3 アプリケーションで固定数のデータベース接続を共有することができます。接続プールの設定方法については、『WebLogic JDBC プログラマーズ ガイド』を参照してください。

Q. パラメータをとらない Oracle ストアド プロシージャは、どのように呼び出すのですか。

A. 次の構文を使用してください。

  CallableStatement cstmt = conn.prepareCall("Begin procName;
END;");
cstmt.execute();

procName は、Oracle ストアド プロシージャの名前です。これは標準的な Oracle SQL 構文であり、どの Oracle DBMS でも動作します。次の構文も使用できます。

 CallableStatement cstmt = conn.prepareCall("{call procName};");
cstmt.execute();

このコードは、Java 拡張 SQL 仕様に準拠しており、Oracle だけでなくすべての DBMS で動作します。

Q. PreparedStatement の文字列値はどのようにバインドするのですか。

A. 文で String をバインドするために、PreparedStatement クラスを取得しようとしていると仮定します。setString() メソッドは、機能しないように見えます。PreparedStatement は次のように設定されています。

  String pstmt = "select n_name from n_table where n_name LIKE '?%'";
PreparedStatement ps = conn.prepareStatement(pstmt);
ps.setString(1, "SMIT");
ResultSet rs = ps.executeQuery();

このコードは機能しません。なぜなら、String で完全な値を指定し (引用符は埋め込まない)、引用符のない疑問符 (?) にバインドする必要があるためです。正しいコードは次のようになります。

  String matchvalue = "smit%";
String pstmt = "select n_name from n_table where n_name LIKE ?";
PreparedStatement ps = conn.prepareStatement(pstmt);

ps.setString(1, matchvalue);
ResultSet rs = ps.executeQuery();

Q. WebLogic jDriver for Oracle を使用し、8 ビット文字セットを使用していますが、期待した文字が表示されません。何が問題なのでしょうか。

A. 8 ビット文字セットの Oracle データベースを Solaris で使用している場合は、クライアントで NLS_LANG を適切な値に設定してください。NLS_LANG を設定しないと、デフォルトで 7 ビット ASCII 文字セットになり、ASCII 128 より大きい文字は適当な文字にマップされます。たとえば、&aacute;、&agrave;、&acirc; はすべて a にマップされます。その他の文字は、疑問符 (?) にマップされます。

Q. Oracle で利用可能なコードセットは、どうしたらわかりますか。

A. Oracle で現在使用できるコードセットを調べるには、SQLPlus からコマンドラインで次の SQL クエリを実行します。

 SQL> SELECT value FROM v$nls_valid_values
WHERE parameter='CHARACTERSET';

現在システムにインストールされているすべてのコードセットのリストが返されます。このリストは、次のように表示されます。

  VALUE
-----------------------------------------------------------
US7ASCII
WE8DEC
WE8HP
US8PC437
WE8EBCDIC37
WE8EBCDIC500
WE8EBCDIC285
...

クエリの値を特定のコードセットに制限するには、次のような SQL クエリを使用します。

 SQL> SELECT value FROM v$nls_valid_values 
WHERE parameter='CHARACTERSET' and VALUE='AL24UTFFSS';

そのコードセットがインストールされている場合は、次のようなリストが表示されます。

  VALUE
-------------------------------------------------------------
AL24UTFFSS

その他のコードセットを追加するには、Oracle のインストール ツールを使用します。詳細については、Oracleに問い合わせてください。

Q. 「ORA」SQLException はどのように調べるのですか。

A. WebLogic jDriver for Oracle アプリケーションでは、次のような SQLException が生成されることがあります。

  java.sql.SQLException:ORA-12536:TNS:operation would block

Oracle エラーは、oerr コマンドを使用して調べることができます。たとえば、エラー ORA-12536 の説明は次のコマンドで表示できます。

 > oerr ora 12536

Q. エラー「ORA-6502」は何を意味するのですか。

A. CallableStatement の OUTPUT パラメータにバインドされる文字列のデフォルト長は 128 文字です。バインド パラメータに割り当てた値がこの長さを超えると、このエラーが発生します。

バインド パラメータの値の長さは、明示的な長さを scale 引数を使って CallableStatement.registerOutputParameter() メソッドに渡すことによって調節できます。

Q. ORA-12705 のテキストを取り出そうとするとエラーが発生するのはなぜですか。

A. このエラーは、ORACLE_HOME 環境変数を適切に設定していないという、よくあるミスから発生します。WebLogic jDriver for Oracle を使用するには、Oracle クライアント ソフトウェアをインストールし、ORACLE_HOME を設定する必要があります。

システムにインストールされていない言語とコードセットの組み合わせで WebLogic jDriver for Oracle のインターナショナライゼーション機能を使用しようとした場合にも、このエラー メッセージが表示されます。適切なエラー テキストの ORA-12705 エラーが表示される場合は、NLS_LANG を適切に設定していないか、システムに正しいコードセットをインストールしていないかのどちらかです。

Q. Oracle のデータベース リンクを使ってデータベースを更新するとリソースが足りなくなってしまうのはなぜですか。

A. Oracle のデータベース リンクを使用してデータベースを更新する場合、終了時に結果セットと文を閉じても、「maximum number of temporary table locks exceeded」というエラーが表示される場合があります。

データベース リンクは、リモート データベースのテーブルやビューにアクセスできるようにするローカル データベースのオブジェクトです。データベース リンクは Oracle サーバによって管理されるので、ドライバではリソースの使用を管理できません。実際にはリンクが生じて処理が実行されますが (その他のプロセスでは、作成されたレコードが表示可能)、接続が終了するまでリソースは解放されません。データベース リンクを削除し、JDBC ドライバを使用して選択、挿入、および更新を実行することで解決してください。

Q. CLOB/NCLOB カラムからマルチバイト文字をアクセスしようとすると「ORA-03120」エラーを受け取るのはなぜですか。

A. CLOB/NCLOB カラムの CLOB の長さを取得するときに OCI レイヤから実際の長さより大きい値が返されると、超過した文字をアクセスすることにより ORA-03120 エラーが発生します。この問題は、Oracle 8.1.6.3 を使用することによって解消されます。

Q. PreparedStatement クラスを実行すると「TRUNC fails:ORA-00932:inconsistent datatypes」エラーが発生するのはなぜですか。

A. Oracle Metalink Bug Database Doc ID:144784.1 によれば、暗黙的なデータ型キャストの不在により、OCI はバインド変数が CHAR データ型であると見なします。SQL 文がバインド変数を DATE データ型として使用し、一方 OCI はそれが CHAR であると考えた場合、SQL パーサにはデータ型の矛盾が発生します。これを解決するには、データ変換関数を明示的に使用して、問題の生じたクエリに含まれるバインド変数を変換します。たとえば、次の選択文字列があるとします。

String st = "select count(*) from simple_table where TRUNC(mydate) = TRUNC(?)"; 

これは、次のように変更する必要があります。

String st = "select count(*) from simple_table where TRUNC(mydate) = TRUNC(TO_DATE(?))"; 

Q. 空白文字列を挿入すると「ORA-01400: Cannot insert NULL into column name」というメッセージが表示されるのはなぜですか。

これは Oracle において確認済みの問題です。varchar2 の値を挿入または更新する際に、空白文字列 ("") を挿入しようとすると、Oracle はこの値を NULL と解釈します。値の挿入先のカラムに NOT NULL 制限がある場合、データベースは ORA-01400 エラーを送出します。

 

Back to Top Previous Next