(補足)Oracleへの接続
- 1. OCI Driverを用いた接続方法
- 2. Thin Driverを用いた接続
- 3. SQL文の実行
この章ではOracleデータベースへの接続について説明します。サンプルプログラムの実装対象とするOracleのバージョンは「8.1.6」ですが、それ以上のバージョンについてもほぼ同じです。
1. OCI Driverを用いた接続方法
Oracleは「Oracle JDBC OCI Driver」と「Oracle JDBC Thin Driver」の2種類のJDBCドライバを提供しています。どちらのドライバを使用する場合でも、Oracleのインストールディレクトリの「jdbc/lib」にある「classes111.zip」か「classes12.zip」(前者はJDK1.1用。後者はJava2用)をクラスパスに含める必要があります。(Oracle 9iではThinドライバとOCIドライバでファイルが分かれていますので、それぞれ必要なものをクラスパスに含めてください。)
「Oracle JDBC OCI Driver」は「Oracle Call Interface(OCI)」を使用してOracleデータベースに接続します。このため実行時にOCIのライブラリ(インストールディレクトリの「lib」以下)が必要で、実質的にOracle Clientがインストールされているマシンでしか使用することができません。実行時にはライブラリのあるディレクトリを、「java.library.path」という環境変数か、Linuxの場合は「LD_LIBRARY_PATH」環境変数に設定する必要があります。
Oracleデータベースへの接続方法はPostgreSQLでの方法とほぼ同じです。まず最初にJDBCドライバをロードします。
Class.forName("oracle.jdbc.driver.OracleDriver");
次に接続するデータベースを指定します。
Connection connection=DriverManager.getConnection("jdbc:oracle:oci8:@oracle.techscore","scott","tiger");
引数の1つ目はデータベースのURL、2つ目がユーザ名、3つ目がパスワードです。データベースのURLはOCI Driverの場合
jdbc:oracle:oci8:@(tnsnames.oraに登録されているデータベースサービス名)
になります。予め「tnsnames.ora」設定ファイルにデータベースが登録されている必要があります。
2. Thin Driverを用いた接続
「Thin Driver」はクライアントライブラリを使用せず、Net8プロトコルを用いて直接Oracleデータベースに接続するタイプのJDBCドライバです。クラスライブラリだけで動作する事ができるので、Oracle Clientがインストールされていないマシンでも動作させる事が可能です。
Oracleデータベースへの接続方法は、「OCI Driver」とほぼ同じです。
Class.forName("oracle.jdbc.driver.OracleDriver"); Connection connection=DriverManager.getConnection("jdbc:oracle:thin:@dbserver:1521:oracle","scott","tiger");
「getConnection」の第1引数の形式だけが異なります。
jdbc:oracle:thin:@(ホスト名):(ポート番号):(接続するデータベースのSID)
ポート番号は、Oracleが稼動しているサーバの「listener.ora」ファイルに記述されています。デフォルトは「1521」です。
「OCI Driver」はJDBCタイプ2、「Thin Driver」はJDBCタイプ4のドライバです。したがって通常は「Thin Driver」の方が使い勝手が良いのですが、機能によっては「OCI Driver」にしかサポートされていないものもあります。使い勝手が良いのは「Thin Driver」、高機能なのは「OCI Driver」といったところでしょうか。場合によって使い分ける必要があります。
3. SQL文の実行
接続完了後のクエリーの実行は、PostgreSQLと全く同じです。Oracleではサンプルとしてインストールされる「scott」スキーマの「DEPT」テーブルを主に使用します。このテーブルの定義は以下の通りです。
DEPTNO | number(2) |
DNAME | varchar2(14) |
LOC | varchar2(14) |
Statement statement=connection.createStatement(); ResultSet result=statement.executeQuery("select DEPTNO,DNAME,LOC from DEPT"); while(result.next()){ ... }
PostgreSQLの場合と異なり、
- 「ResultSet」はデフォルトで、nextメソッドの方向にしか操作できないという点
- 実行するクエリー文の最後にセミコロン(;)をつけてはいけない点
に注意してください。またOCIドライバで日本語データを含むSQL文を扱う場合、環境変数「NLS_LANG」が適切に設定されていなければならない点にも注意してください。Linuxの場合は
export NLS_LANG=Japanese_Japan.JA16EUC
とする事になります。
更新処理の方法もPostgreSQLと同じです。
PreparedStatement statement=connection.prepareStatement("insert into DEPT values(?,?,?)"); ... statement.executeUpdate();
(実習課題1)
以下のコンソールプログラムを作成しなさい。
- Oracleデータベースのテーブル内容を表示する。テーブルは任意で良い。
- OCI Driverを用いて作成する事。
(実習課題2)
以下のコンソールプログラムを作成しなさい。
- Oracleデータベースのテーブルにデータを追加する。テーブルは任意でよい。
- 追加するデータは任意でよいが、必ず日本語を含める事。
- Thin Driverを用いて作成する事。
(実習課題3)
実習課題2のプログラムを改良しなさい。
- OCI Driverを用いて作成する事。