Nashorn から JDBC で Oracle DB に接続する・その 3

はじめに

Nashorn 用の JavaScript プログラムから JDBC で Oracle DB に接続する手順のご紹介の続きです。今回は Oracle DB に接続して SQL を実行する手順をご紹介します。

前回までの記事を読まれていない方は、こちらこちらをご覧下さい。

このドキュメントの URL は https://blogs.oracle.com/nashorn_ja/entry/nashorn_jdbc_3 です。

JDBC によるデータベースの接続テスト

JDBC 開発者ガイドにあるプログラムを元に Nashorn で動作する JavaScript のプログラムを作成します。

元のプログラムは JDBC OCI ドライバを使用してデータベースへの接続確認をするプログラムです。

プログラム

元の Java のプログラムをほとんどそのまま Nashorn の JavaScript に置き換えたコードがこちらです。

// Invoke jjs with -scripting option.

/*
 * This sample can be used to check the JDBC installation.
 * Just run it and provide the connect information. It will select
 * "Hello World" from the database.
 */

var OracleDataSource = Java.type("oracle.jdbc.pool.OracleDataSource");

function main() {

  // Prompt the user for connect information
  print("Please enter information to test connection to the database");

  var user, password, database;

  user = readLine("user: ");
  slash_index = user.indexOf('/');
  if (slash_index != -1)
  {
    password = user.substring(slash_index + 1)
    user = user.substring(0, slash_index);
  }
  else
    password = readLine("password: ");
  database = readLine("database(a TNSNAME entry): ");

  java.lang.System.out.print("Connecting to the database...");
  java.lang.System.out.flush();
  print("Connecting...");
  // Open an OracleDataSource and get a connection
  var ods = new OracleDataSource();
  ods.setURL("jdbc:oracle:oci:@" + database);
  ods.setUser(user);
  ods.setPassword(password);
  var conn = ods.getConnection();
  print("connected.");

  // Create a statement
  var stmt = conn.createStatement();

  // Do the SQL "Hello World" thing
  var rset = stmt.executeQuery("select 'Hello World' from dual");

  while (rset.next())
    print(rset.getString(1));
  // close the result set, the statement and the connection
  rset.close();
  stmt.close();
  conn.close();
  print("Your JDBC installation is correct.");
}

main();
  • oracle.jdbc.pool.OracleDataSource を Java.type() に渡して、Nashorn 側でインスタンスが作成可能なオブジェクトにしています。
  • Java の System.out.println() と System.out.flush() は java.lang. を先頭に付けて呼び出しています。
  • Java のプログラムに合った readEntry() メソッドは Nashorn の readLine() 関数で置き換えています。

Java のメソッドであることをほとんど意識することなく、JavaScript から呼び出せていることが分かります。

プログラムの実行

JDBC OCI ドライバを使用する場合は、事前に LD_LIBRARY_PATH 環境変数を設定する必要があります。

また、Nashorn の readLine() 関数を使用するため、jjs コマンドに -scripting オプションを付けて実行しています。

$ export LD_LIBRARY_PATH=${ORACLE_HOME}/lib
$ jjs -scripting -cp ${ORACLE_HOME}/jdbc/lib/ojdbc6.jar JdbcCheckup.js
Please enter information to test connection to the database
user: test
password: test
database(a TNSNAME entry): orcl
Connecting to the database...Connecting...
connected.
Hello World
Your JDBC installation is correct.

JDBC OCI ドライバを使用して、データベースに "select 'Hello World' from dual" という SQL を発行することができました。

リモートのマシンに接続する場合は、database の入力を :: の様に指定して下さい。

より JavaScript 的なコード

先ほどのコードは Java のプログラムをほとんどそのままなぞっているため、とても Java 的なコードになっていましたが、適宜 JavaScript で書きやすい書き方に置き換えてお使い下さい。

var OracleDataSource = Java.type("oracle.jdbc.pool.OracleDataSource");

var jdbc = {

  user: function(u) {

    this.user = u;
    return this;

  },

  password: function(p) {

    this.password = p;
    return this;

  },

  database: function(d) {

    this.database = d;
    return this;

  },

  open: function() {

    var ods = new OracleDataSource();
    ods.setURL("jdbc:oracle:oci:@" + this.database);
    ods.setUser(this.user);
    ods.setPassword(this.password);

    this.conn = ods.getConnection();
    return this;

  },

  close: function() {

    this.rset.close();
    this.stmt.close();
    this.conn.close();

    return this;

  },

  executeQuery: function(q) {

    this.stmt = this.conn.createStatement();
    this.rset = stmt.executeQuery(q);

    return this;

  },

  resultSet: function() {

    return this.rset;

  }

}

function main() {

  var user = readLine("user: ");
  var password = readLine("password: ");
  var database = readLine("database: ");

  var j = new jdbc();
  var rset = j.user(user).password(password).database(database). \
             open().executeQuery(query).resultSet(); 

  while (rset.next()) {

    print(rset.getString(1));

  }
  j.close();

}

main();

この様な形で、JDBC の API を JavaScript のライブラリのように扱うことが簡単に出来ます。

まとめ

今回は Oracle DB に接続して SQL を実行する手順をご紹介しました。

Java で JDBC のプログラムを書いたことがある方であれば、とても簡単に Nashorn 向けのプログラムを書くことが出来ることがご理解いただけたと思います。

Comments:

Post a Comment:
Comments are closed for this entry.
About

JavaVM 用 JavaScript エンジンの Nashorn について情報発信しているブログです。Nashorn の読み方はナズホーンです。

Search

Archives
« 7月 2015
   
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
       
Today