Java と JDBC を使用した Actian Zen へのアクセス

このチュートリアルでは、Java と JDBC コマンドを使用して Actian Zen データベースに接続する方法を学習します。

右側の「このページの内容」では当ページで扱うトピックを示しています。

Java セットアップ

最新バージョンの JDK(Java Development Kit)がシステムにインストールされていることを確認します。

Windows 上の Java

Java Development Kit は Adopt Open JDK サイトから入手できます。インストールするには、当該サイトのインストール手順に従ってください。このチュートリアルはデフォルト設定で機能します。Java とそのライブラリがシステムに追加されます。

すべてが正しくインストールされたら、コマンド プロンプトを開いて次のコマンドを実行できます。

java -version

これに応じて、インストールした Java のバージョンが出力されます。次のコマンドを実行します。

javac -version

これも成功し、Java コンパイラの現在のバージョンが報告されるはずです。

Linux 上の Java

Java Development Kit は Adopt Open JDK サイトから入手できます。インストールするには、当該サイトのインストール手順に従ってください。このチュートリアルはデフォルト設定で機能します。

ダウンロードが完了したら、プロンプトを開きます。次に入力するコマンドには管理者権限が必要であるため、次のコマンドを実行します。

sudo su

続行する前に、root のパスワードの入力を求められる場合があります。

次に、JDK を保持するディレクトリを作成します。

mkdir /opt/jdk

このディレクトリに、ダウンロードしたファイルを展開します。

tar -zxf ~/Downloads/jdk-12.0.2_linux-x64_bin.tar.gz -C /opt/jdk

ファイルが展開されたことを確認するには、作成したディレクトリ内のファイルを見ます。JDK 用のサブディレクトリがあるはずです。

ls /opt/jdk

この場合は、jdk-12.0.2 という名前の単一のサブディレクトリが表示されます。

これをデフォルトの Java 環境として設定するには、Java 仮想マシン(JVM)と Java コンパイラへのシンボリック リンクを作成します。これを行うには、次の 2 つのコマンドを実行します。

update-alternatives --install /usr/bin/java java /opt/jdk/jdk-12.0.2/bin/java 100
update-alternatives --install /usr/bin/javac javac /opt/jdk/jdk-12.0.2/bin/javac 100

リンクが機能するか確認したい場合は、Java コンパイラと JVM のバージョンを尋ねるコマンドを実行することができます。

java -version

javac -version

ランタイムのバージョン番号が応答されます。

管理者権限セッションから離れます。

exit

これは、次の手順でファイル パスが正しく解決されるようにするためにも必要となります。

Java ライブラリ ファイルを含むディレクトリを指すように CLASSPATH 環境変数を設定し、JAVA_HOME 環境変数を JDK のルート ディレクトリに設定する必要があります。

これを実行し、コンピューターにログインするたびに実行されるようにするには、.bash_profile に変数値を設定します。お好みのエディターで .bash_profile を開きます。たとえば、次のように指定します。

nano ~/.bash_profile

ファイルがまだ存在しない場合には、エディターは空白のドキュメントを開きます。ドキュメントが空白でない場合は、最後までスクロールして、次の行を追加します。

# Set the CLASSPATH for Java
export CLASSPATH="/opt/jdk/jdk-12.0.2/lib"
export JAVA_HOME="/opt/jdk/jdk12.0.2"

source コマンドを実行するか、またはログアウトしてからログインし直して、環境を更新します。

JDBC ドライバーのインストール

JDBC(Java Database Connectivity)は、アプリケーションが標準 API を使用して標準的な方法でさまざまなデータベースと対話できるようにする Java API です。Actian Zen データベースでは、JDBC ドライバーを使用できます。この JDBC ドライバーは、100% Java 認定の Type 4 ドライバーです。

Zen JDBC ドライバーの詳細については、Zen JDBC ドライバーの概要をお読みください。

Windows での JDBC ドライバーのインストール

Actian Zen JDBC ドライバーを Windows にインストールするには、Actian Zen v15 の JDBC Windows SDK パッケージをダウンロードします。次のページからダウンロードできます。
https://www.agtech.co.jp/actian/support/reference/sdk/access_methods/jdbc/

アーカイブ内のファイルをローカル システムに展開します。

次に、Zen JDBC ドライバーを使用するように CLASSPATH および PATH 環境変数を設定します。CLASSPATH については、Zen JDBC SDK の \bin ディレクトリを追加して、次のファイルにアクセスできるようにします。

  • jpscs.jar
  • pvjdbc2.jar
  • pvjdbc2x.jar

PATH 変数については、pvjdbc2.dll の完全パスを追加します。このファイルは、ファイルが展開されたフォルダー下の \bin ディレクトリにあります。

Linux での JDBC ドライバーのインストール

Linux では、Actian Zen とインターフェイスで接続するために必要な Java コンポーネントは、データベースと共にインストールされます。これ以上のインストールは必要ありません。

CLASSPATH 環境変数が、.jar ファイルのパスを含めるように更新されている必要があります。必要なファイルとして次のものがあり、これらは /usr/local/actianzen/lib にあります。

  • jpscs.jar
  • pvjdbc2.jar
  • pvjdbc2x.jar

ターミナルで、現在のユーザー アカウントの ~/.bash_profile をエディターで開きます。たとえば、次のように指定します。

nano ~/.bash_profile

以前に CLASSPATH エントリを作成した場所まで下へスクロールします。他の .jar ファイルのパスを含めるようにエントリを更新する必要があります。次のようにエントリを更新します。

export CLASSPATH=$CLASSPATH:<path to pvjdbc2.jar directory>/pvjdbc2.jar
export CLASSPATH=$CLASSPATH:<path to pvjdbc2x.jar directory>/pvjdbc2x.jar
export CLASSPATH=$CLASSPATH:<path to jpscs.jar directory>/jpscs.jar

Linux、macOS、および Raspbian では、このファイルはデフォルトで /usr/local/actianzen/lib にインストールされます。

ソース コマンドを実行するか、またはログアウトしてからログインし直して、環境を更新します。

詳細については、Zen(Linux ベースのシステム用)のインストールを参照してください。

JDBC を使用した Actian Zen へのアクセス

以下のトピックでは、Java および JDBC コマンドを使用して Actian Zen データベースに接続する方法について説明します。

  • 独自のデータベースの作成
  • データベースへの接続
  • JDBC 接続文字列

これらのトピックの詳細については、Actian Zen ドキュメントの Zen JDBC 2 ドライバーを使用したプログラミングを参照してください。

独自のデータベースの作成

データベースを作成するには、Zen Control Center の[エンジン]下にある[データベース]を右クリックし、[新規作成]>[データベース]を選択します。

この例では、新しいデータベースに ZENDB という名前を付け、その場所として C:\actian\databases を選択します。残りのオプションは、デフォルトの設定のままにしておきます。

本チュートリアルの残り部分では、この ZENDB データベースを使用します。

詳細については、Actian Zen ドキュメントのデータベースの作成を参照してください。

データベースへの接続

データベースへの接続を確立するには、コードで Class.forName() とドライバーの完全修飾クラス名を使用して、実行時に Zen JDBC ドライバーを読み込む必要があります。このドライバーは、次のコード例に示されている com.pervasive.jdbc.v2.Driver です。

public class JDBCConnect {
  public static void main(String[] args) {
    try {
      Class.forName("com.pervasive.jdbc.v2.Driver");
      System.out.println("Driver loaded.");
    } catch (ClassNotFoundException exc) {
      System.err.println("Could not load the driver.");
      exc.printStackTrace();
    }
  }
}

コマンドを使用して、このコードをコンパイルすることができます。

javac JDBCConnect.java

次のコマンドを使用して、コードを実行します。

java JDBCConnect

例外が返されなければ、ドライバーは正常に読み込まれました。例外は、ドライバーが CLASSPATH にないことを示している可能性があるので、その変数を確認して、再試行してください。

JDBC 接続文字列

JDBC を介してデータベースとやり取りするには、JDBC 接続文字列を作成する必要があります。JDBC 接続文字列には、接続に関するいくつかの情報の項目が含まれています。一部の項目は必須ですが、それ以外は任意です。ここでは必須項目のみを使用します。詳細については、Zen ドキュメントの接続文字列の概要を参照してください。

接続文字列は次のようになります。

jdbc:pervasive://{サーバー名または IP アドレス}:{ポート番号}/{データベース名}

jdbc:pervasive は Actian Zen データベース ドライバーを定義します。

サーバー名または IP アドレスについては、Zen データベースはお使いのコンピューターで実行されているため、localhost を使用します。

デフォルトでは、Zen データベースとの通信に使用されるネットワーク ポートは 1583 です。

データベースの名前は、Zen Control Center で定義した名前で、ここでは小文字です。

以前に作成した ZENDB データベースの場合、接続文字列は次のようになります。

jdbc:pervasive://localhost:1583/zendb

これで、ドライバーが読み込まれ、データベースに接続できるようになりました。

接続オブジェクトは DriverManager.getConnection() メソッドを使用して作成されます。このメソッドは、パラメーターとして接続文字列、ユーザー名、およびパスワードを取ります。使用するデータベースはユーザー名もパスワードも持たないため、どちらの値にも空の文字列を使用します。接続文字列を取得する方法は次のとおりです。

Connection conn = DriverManager.getConnection("jdbc:pervasive://localhost:1583/zendb", "", "");

ドライバーを読み込み、ZENDB データベースに接続するための完全なソース コードは次のとおりです。

import java.sql.*;
public class JDBCConnect {
  private static final String JDBC_DRIVER = "com.pervasive.jdbc.v2.Driver";
  public static void main(String[] args) {
    try {
      // Load the driver
      Class.forName(JDBC_DRIVER);
      System.out.println("Driver was loaded.");
    } catch (ClassNotFoundException exc) {
      System.err.println("Could not load the driver.");
      exc.printStackTrace();
      System.exit(-1);
    }
    try {
      Connection conn = DriverManager.getConnection("jdbc:pervasive://localhost:1583/zendb", "", "");
      //
      // The commands to interact with the database go here.
      //
      conn.close();
    } catch (SQLException exc) {
      System.err.println("Could not connect to the database.");
      exc.printStackTrace();
    }
  }
}

次を使用して、このコードをコンパイルすることができます。

javac JDBCConnect.java

次のように実行します。

java JDBCConnect

Actian Zen JDBC ドライバーの詳細については、Zen JDBC 2 ドライバーを使用したプログラミングを参照してください。

JDBC を使用したデータの作成

このセクションでは、Java および JDBC を使用して、Actian Zen データベースで Create コマンドを実行する方法を学習します。ZENDB データベースにテーブルを追加し、そのテーブルに行を挿入します。

  • テーブルの作成
  • テーブルへの行の挿入

JDBC を使用したプログラミングの詳細については、Actian Zen ドキュメントの Zen JDBC 2 ドライバーを使用したプログラミングを参照してください。

テーブルの作成

以前に作成した ZENDB データベースは、現在のところ空です。テーブルを作成するには、Statement オブジェクトを使用していくつかの SQL を実行する必要があります。このオブジェクトは、以前に作成した Connection オブジェクトから取得できます。

Connection conn = DriverManager.getConnection("jdbc:pervasive://localhost:1583/zendb", "", "");
Statement statement = conn.createStatement();

これで、次の SQL を実行してテーブルを作成することができます。

statement.execute("CREATE TABLE Students (Id IDENTITY, Name CHAR(32), Account_Balance INT DEFAULT 0)");

CREATE TABLE を使用してテーブルを作成するために、以下を指定します。

  • テーブル名:Students
  • 列のセット:Id、Name、Account_Balance
  • 各列のデータ型:
    • Id 列のデータ型は IDENTITY です。これは自動インクリメントする整数値です。つまり、新しい行がテーブルに挿入されたときに、その値が自動的に設定されます。
    • Name 列は CHAR(32) です。32 バイトまでの文字列を格納できます。
    • Account_Balance 列は INT DEFAULT 0 です。これは、整数のみを使用でき、この列の値を設定しなかった場合にはゼロになることを示します。

使用可能なデータ型の詳細については、データ型のドキュメントを参照してください。

テーブルを作成するための Java の完全な例は以下のとおりです。

import java.sql.*;
public class CreateTable {
  private static final String JDBC_DRIVER =
      "com.pervasive.jdbc.v2.Driver";
  private static final String CONNECTION_STRING =
      "jdbc:pervasive://localhost:1583/zendb";
  public static void main(String[] args) {
    try {
      Class.forName(JDBC_DRIVER);
    } catch (ClassNotFoundException exc) {
      exc.printStackTrace();
      System.exit(-1);
    }
    try {
      Connection conn = DriverManager.getConnection(CONNECTION_STRING, "", "");
      Statement statement = conn.createStatement();
      statement.execute(
          "CREATE TABLE Students (Id IDENTITY, Name CHAR(32), Account_Balance INT DEFAULT 0)");
      System.out.println("Students table created.");
      conn.close();
    } catch (SQLException exc) {
      exc.printStackTrace();
    }
  }
}

このクラスをコンパイルします。

javac CreateTable.java

次のように実行します。

java CreateTable

次が返されます。

Students table created.

Zen Control Center で、F5 キーを押してビューを更新し、追加された Students テーブルを確認します。テーブル名を右クリックして[編集]を選択し、テーブルの作成時に指定した 3 つの列を確認します。

データベース テーブルを作成するときの一般的な規則がいくつかあります。

  • テーブルには、データベース内で一意の名前を付ける必要があります。
  • 列には、各テーブル内で一意の名前を付ける必要があります。
  • 各テーブルには、ID 列がある必要があります。

テーブルへの行の挿入

テーブルを作成したので、データをいくつか挿入しましょう。

テーブルに行を挿入するには、Connection オブジェクトを使用して、SQL INSERT ステートメントを実行できる Statement オブジェクトを作成します。

Connection conn = DriverManager.getConnection(CONNECTION_STRING, "", "");
Statement statement = conn.createStatement();
statement.execute("INSERT INTO Students(Name, Account_Balance) VALUES ('John', 100)");

このステートメントでは、行を挿入するテーブル、含める列、およびそれらの列に格納する値を指定します。Id 列を指定する必要はありません。この列は IDENTITY 型であるため、自動インクリメント値を取得することを意味します。

このコードを実行した後、Zen Control Center に戻って F9 キーを押し、グリッドでクエリを実行します(これは SELECT ステートメントです)。このようにテーブルに表示されます。

Id は、増分値として自動的に 1 に設定されており、Name および Account_Balance は挿入した値になっていることがわかります。Account_Balance を省略していたら、デフォルト値の 0 が使用されたでしょう。

次のコード例では、以降のセクションで使用するデータを増やすよう、行を追加します。

import java.sql.*;
public class InsertData {
  private static final String JDBC_DRIVER = "com.pervasive.jdbc.v2.Driver";
  private static final String CONNECTION_STRING = "jdbc:pervasive://localhost:1583/zendb";
  public static void main(String[] args) {
    try {
      Class.forName(JDBC_DRIVER);
    } catch (ClassNotFoundException exc) {
      exc.printStackTrace();
      System.exit(-1);
    }
    try {
      Connection conn = DriverManager.getConnection(CONNECTION_STRING, "", "");
      Statement statement = conn.createStatement();
      statement.execute("INSERT INTO Students(Name, Account_Balance) VALUES ('John', 100)");
      statement.execute("INSERT INTO Students(Name, Account_Balance) VALUES ('Mary', 200)");
      statement.execute("INSERT INTO Students(Name, Account_Balance) VALUES ('Bob', 300)");
      statement.execute("INSERT INTO Students(Name, Account_Balance) VALUES ('Amy', 400)");
      statement.execute("INSERT INTO Students(Name, Account_Balance) VALUES ('Sam', 500)");
      statement.execute("INSERT INTO Students(Name, Account_Balance) VALUES ('Jill', 600)");
      statement.execute("INSERT INTO Students(Name, Account_Balance) VALUES ('Jim', 0)");
      statement.execute("INSERT INTO Students(Name, Account_Balance) VALUES ('Molly', 500)");
      statement.execute("INSERT INTO Students(Name, Account_Balance) VALUES ('Bill', 500)");
      conn.close();
      System.out.println("Data inserted.");
    } catch (SQLException exc) {
      exc.printStackTrace();
    }
  }
}

以前に実行したように、コンパイルして、プログラムが正常に実行されることを確認します。

詳細とサンプルについては、JDBC API のリファレンスを参照してください。

JDBC を使用したデータの読み取り

このセクションでは、Java および JDBC を使用して、Actian Zen データベースで基本的な読み取りクエリ コマンドを実行する方法を学習します。次のことを行います。

  • SELECT を使用してテーブル内のすべての行を読み取る
  • WHERE を使用して条件を指定する
  • ORDER BY を使用して行を並べ替える
  • CREATE VIEW を使用してクエリを保存する

SELECT を使用してテーブル内のすべての行を読み取る

最も簡単な SELECT の例は、すべての行を返す SELECT * です。SQL コマンドは大文字と小文字を区別しないことに留意してください。

以前に、Statement オブジェクトで execute() メソッドを使用してテーブルの作成とデータの挿入を行いました。しかし、SELECT などのデータを返すステートメントの場合は、ResultSet オブジェクトを返す executeQuery() メソッドを使用する必要があります。

ResultSet オブジェクトは、返された値の行を読み取るために使用されます。ResultSet で next() メソッドを呼び出すことにより、各行を取得します。next() メソッドは、読み取るデータがある場合は true を返し、これ以上データがない場合は false を返します。

行を取得したら、列の名前またはインデックスによって列の値を読み取ることができます。名前の方が読みやすいので、一般的には名前で列にアクセスしたいでしょう。列のデータ型に応じて、異なるメソッドを使用して列のデータを取得します。テキストの場合は getString() を使用します。整数の場合は getInt() を使用します。例を見てみましょう。

// SQL query to return all rows from the Students table
ResultSet resultSet = statement.executeQuery("SELECT * FROM Students");
while (resultSet.next()) {
  int id = resultSet.getInt("id");
  String name = resultSet.getString("name");
  int accountBalance = resultSet.getInt("Account_Balance");
  System.out.println(
    String.format("%s %s %d", id, name, accountBalance)
  );
}

このコードを実行すると、Id、Name、および Account_Balance 列の値が出力されます。

1 John      100
2 Mary      200
3 Bob       300
4 Amy       400
5 Sam       500
6 Jill      600
7 Jim         0
8 Molly     500
9 Bill      500

結果の順序を指定しなかったので(それはすぐにできるようになります)、返されるレコードは、ここで示す順序にならない可能性があることに留意してください。

SELECT クエリは、テーブル内の必要な列名のリストが指定されることを想定しています。すべての列が必要な場合は、列名の代わりに *(アスタリスク)を使用できます。そうでない場合は、各列名をカンマで区切って指定します。次のクエリは SELECT * と同じ結果になります。

ResultSet resultSet = statement.executeQuery("SELECT Id, Name, Account_Balance FROM Students");

WHERE を使用して条件を指定する

SELECT クエリで、結果をフィルターする条件を追加することができます。口座残高が 300 を超える行のみを表示するようにフィルタリングしましょう。WHERE 句を使用して、この制約を指定します。

ResultSet resultSet = statement.executeQuery("SELECT * FROM Students WHERE Account_Balance > 300");

上のステートメントを使用してコードを実行すると、次の結果が表示されます。

4 Amy       400
5 Sam       500
6 Jill      600
8 Molly     500
9 Bill      500

AND または OR を使用して、複数の条件でフィルタリングすることができます。次の例は、口座残高が 300 を超えており、かつ 800 以下である行のみを表示します。

ResultSet resultSet = statement.executeQuery(
  "SELECT * FROM Students WHERE Account_Balance > 300 AND Account_Balance <= 800");

次の結果になります。

4 Amy       400
5 Sam       500
6 Jill      600
8 Molly     500
9 Bill      500

詳細については、制限句を参照してください。

ORDER BY を使用して行を並べ替える

ORDER BY 句を使用して行を並べ替えることができます。次の例は、結果を名前の昇順で並べ替えます。

ResultSet resultSet = statement.executeQuery("SELECT * FROM Students ORDER BY Name");

次の結果になります。

4 Amy       400
9 Bill      500
3 Bob       300
6 Jill      600
7 Jim         0
1 John      100
2 Mary      200
8 Molly     500
5 Sam       500

DESC キーワードを使用すると、順序を逆にすることができます。

ResultSet resultSet = statement.executeQuery("SELECT * FROM Students ORDER BY Name DESC");

ORDER BY と WHERE を組み合わせることで、結果のフィルタリングと並べ替えの両方を行えます。

ResultSet resultSet = statement.executeQuery(
  "SELECT * FROM Students WHERE Account_Balance > 300 ORDER BY Name");

次の結果が表示されます。

4 Amy       400
9 Bill      500
6 Jill      600
8 Molly     500
5 Sam       500

CREATE VIEW を使用してクエリを保存する

ビューは、データベース内のデータを調べるためのもう 1 つのメカニズムです。テーブルのように動作しますが、既存のテーブルからデータを取得します。仮想テーブルと呼ばれることもあります。頻繁に使用する SELECT ステートメントがある場合は、それをビューとして保存し、アクセスしやすくすることができます。

ビューを作成するには、CREATE VIEW ステートメントを使用します。次の例では、Students テーブルのうち、口座残高が 200 未満の行のみを表示するビューを作成します。ビューでは、テーブル作成時のすべての列を使用する必要がないことに留意してください。この例では、Id 列と Account_Balance 列を使用していますが、Name 列は使用していません。

statement.execute("CREATE VIEW Almost_Empty_Balance (Id, Account_Balance) AS SELECT Id, Account_Balance from Students WHERE Account_Balance < 200");

Zen Control Center に戻り、ZENDB の[ビュー]ノードを展開すると、Almost_Empty_Balance というビューが表示されています。

ビューを開くと、口座残高が 200 未満の学生の ID と Account_Balance の値が表示されます。

Java から、ビューのクエリを実行します。方法はテーブルのクエリと同じで、テーブル名の代わりにビュー名を使用します。

ResultSet resultSet = statement.executeQuery("SELECT * FROM Almost_Empty_Balance");
while(resultSet.next()) {
  int id = resultSet.getInt("id");
  int accountBalance = resultSet.getInt("Account_Balance");
  System.out.println(
    String.format("%s   %4d", id, accountBalance)
  );
}

結果は次のようになります。

1  100
7    0

JDBC を使用したデータの更新

このセクションでは、JDBC を使用して行を変更するためのコマンドを実行する方法を学習します。このチュートリアルで以前に作成した ZENDB データベースを使用して、次の操作を行います。

  • 新しい列を追加してテーブルの構造を更新する
  • 値を変更して行を更新する
  • テーブル列のデフォルト値を更新する

新しい列を追加してテーブルの構造を更新する

Students テーブルに新しい列を追加しましょう。この列には、学生の専攻科目のデータを保持します。

ADD 句を指定した SQL ALTER TABLE ステートメントを使用して、列を追加します。Statement クラスのインスタンスを使用して、ステートメントを実行します。Major という名前の新しい列を Students テーブルに追加し、デフォルト値を "Undecided" に設定します。

statement.execute("ALTER TABLE Students ADD Major CHAR(32) DEFAULT 'Undecided'");

このコマンドでは、Major という列を追加して Students テーブルを変更しました。この列は文字値を取り、他の値が指定されていない場合は、デフォルトで Undecided になります。

Zen Control Center での結果は次のようになります。すべての行が、新しい列にデフォルト値を取得していることに注目してください。

次のコード(「データの読み取り」トピックのコードを改変したもの)を使用して、新しい列のデータを照会することができます。

// SQL query to return all rows from the Students table
ResultSet resultSet = statement.executeQuery("SELECT * FROM Students");

while (resultSet.next()) {
  int id = resultSet.getInt("id");
  String name = resultSet.getString("name");
  int accountBalance = resultSet.getInt("Account_Balance");
  String major = resultSet.getString("Major");

  System.out.println(
    String.format("%s %s %d" %s, id, name, accountBalance, major)
  );
}

次のような、Zen Control Center で見たものと一致する結果が返されます。

1 John      100 Undecided
2 Mary      200 Undecided
3 Bob       300 Undecided
4 Amy       400 Undecided
5 Sam       500 Undecided
6 Jill      600 Undecided
7 Jim         0 Undecided
8 Molly     500 Undecided
9 Bill      500 Undecided

繰り返しますが、ORDER BY 句を指定していないので、結果の順序が異なる可能性があることに留意してください。

値を変更して行を更新する

UPDATE ステートメントを使用して、テーブル内の行の値を変更することができます。通常は、テーブル内の特定の行、または何らかの条件を満たす行に対してのみ更新を適用したいでしょう。

UPDATE を適用する行を制限するには、WHERE 句を使用します。この句には、行を更新するかどうかの決定に使用される条件が含まれます。

statement.execute("UPDATE Students SET Major='English' WHERE Major='Undecided'");

この場合は、すべての学生が未定(Undecided)だったので、すべてが更新されました。

1 John      100 English
2 Mary      200 English
3 Bob       300 English
4 Amy       400 English
5 Sam       500 English
6 Jill      600 English
7 Jim         0 English
8 Molly     500 English
9 Bill      500 English

単一行を更新したい場合は、それに応じて WHERE 句を更新することができます。

このデータベースで、Mary の専攻科目を Computer Science に更新しましょう。Id フィールドが 2 の行にのみ更新が適用される WHERE 句を使用できます。これに一致するのは Mary の行だけです。

statement.execute("UPDATE Students SET Major='Computer Science' WHERE Id=2");

Mary だけが更新されたことがわかります。

1 John      100 English
2 Mary      200 Computer Science
3 Bob       300 English
4 Amy       400 English
5 Sam       500 English
6 Jill      600 English
7 Jim         0 English
8 Molly     500 English
9 Bill      500 English

テーブル列のデフォルト値を更新する

Students テーブルを作成した際に、Account_Balance 列にデフォルト値 100 を指定しました。Major 列を追加したとき、他の値が指定されていない場合のデフォルト値を Undecided に設定しました。

デフォルト値を変更したい場合は、ALTER TABLE ステートメントを使用できます。ALTER ステートメントは、以前、テーブルに列を追加するために使用しました。ここでは、ALTER TABLE ... MODIFY を使用して列のプロパティを変更します。

statement.execute("ALTER TABLE Students MODIFY Major CHAR(32) DEFAULT 'Math'");

新しい行を挿入すると、変更の影響を確認できます。

statement.execute("INSERT INTO Students (Name, Account_Balance) VALUES ('Sue',700)");

Sue の行が、新しいデフォルト値である Math を専攻として作成されたことを確認できます。

 1 John      100 English
 2 Mary      200 Computer Science
 3 Bob       300 English
 4 Amy       400 English
 5 Sam       500 English
 6 Jill      600 English
 7 Jim         0 English
 8 Molly     500 English
 9 Bill      500 English
10 Sue       700 Math

JDBC を使用したストアド プロシージャ

JDBC を使用して Actian Zen にアクセスする際にサポートされる、2 つの高度な SQL 機能について見ていきます。

  • ストアド プロシージャ
  • SQL トリガー

ストアド プロシージャは、保存された SQL ステートメントに類似したものです。テーブルへの挿入など、データの違いだけで頻繁に実行されるステートメントがある場合、そのステートメントはストアド プロシージャの候補となります。

SQL トリガーは、データの変更イベントが発生すると自動的に実行される特殊なストアド プロシージャです。

これらの機能の使用については、以下のトピックで説明します。

  • 新しい学生を挿入するストアド プロシージャを作成する
  • パラメーターを使用するストアド プロシージャを作成する
  • 口座残高を増やす SQL トリガーを作成する

新しい学生を挿入するストアド プロシージャを作成する

ストアド プロシージャには、何度も実行するステートメントを含めます。これら複数のステートメントを個々に実行する代わりに、1 つのストアド プロシージャを呼び出して複数のステートメントを実行することができます。

CREATE PROCEDURE を使用してストアド プロシージャを作成します。単一行を挿入するプロシージャを作成しましょう。プロシージャのテキストは次のとおりです。

CREATE PROCEDURE ADD_Student();
BEGIN
  INSERT INTO Students (Name, Account_Balance) VALUES ('Max',0);
END

CREATE PROCEDURE の直後に示される ADD_Student は、ストアド プロシージャの名前です。このプロシージャは、Zen Control Center の SQL Editor で実行して作成するか、または Java で次のように実行して作成することができます。

statement.execute("CREATE PROCEDURE ADD_Student();\n" +
  "BEGIN\n" +
  "   INSERT INTO Students (Name, Account_Balance) VALUES ('Max',0);\n" +
  "END");

ステートメントを実行した後、Zen Control Center で ZENDB の[ストアド プロシージャ]ノードを展開すると、ADD_Student が表示されます。

ストアド プロシージャを実行するには、パラメーターを指定しないで、ストアド プロシージャの名前で CALL ステートメントを使用します。

statement.execute("CALL ADD_Student()");

テーブルを照会すると、ストアド プロシージャで指定した値と Major 列のデフォルト値を使用して新しい行が挿入されたことがわかります。

 1 John      100 English
 2 Mary      200 Computer Science
 3 Bob       300 English
 4 Amy       400 English
 5 Sam       500 English
 6 Jill      600 English
 7 Jim         0 English
 8 Molly     500 English
 9 Bill      500 English
10 Sue       700 Math
11 Max         0 Math

パラメーターを使用するストアド プロシージャを作成する

前のストアド プロシージャは非常に制限されたものであり、Add_Student() を呼び出すたびに Max しか挿入されません。

人の名前と口座残高をプロシージャに渡すことができれば、より有用になるでしょう。それを行うために、パラメーターを使用するストアド プロシージャを作成することができます。パラメーターによって、実行時に使用するプロシージャのデータを指定することができます。

Name 列と Account_Balance 列のパラメーターを受け入れるストアド プロシージャを作成します。

statement.execute("CREATE PROCEDURE ADD_Student2 (in:Name CHAR(32), in :Amount INTEGER);\n" +
"BEGIN\n"+
"     INSERT INTO Students(Name, Account_Balance) VALUES (:Name, :Amount);\n"+
"END");

この場合、受け入れたパラメーターはコードのこの部分で定義されます。

(in:Name CHAR(32), in :Amount INTEGER)

これは、プロシージャが受け入れる 2 つのパラメーターの名前とデータ型を指定しています。名前に Fran、口座残高に 500 を使用してプロシージャを実行するには、次のステートメントを実行します。

statement.execute("CALL ADD_Student2('Fran', 500)");

現在、行は次のようになっています。

 1 John      100 English
 2 Mary      200 Computer Science
 3 Bob       300 English
 4 Amy       400 English
 5 Sam       500 English
 6 Jill      600 English
 7 Jim         0 English
 8 Molly     500 English
 9 Bill      500 English
10 Sue       700 Math
11 Max         0 Math
12 Fran      500 Math

口座残高を増やす SQL トリガーを作成する

SQL トリガーは、指定したテーブルで SQL ステートメントが実行される前または後に実行するストアド プロシージャです。CREATE TRIGGER ステートメントを使用してトリガーを作成します。トリガーを作成するために必要なその他の新しい句があります。

statement.execute("CREATE TRIGGER Add_Balance\n"+
  "AFTER INSERT on Students\n"+
   "REFERENCING NEW AS Student\n"+
   "FOR EACH ROW\n"+
   "UPDATE Students SET\n"+
   "Account_Balance = student.Account_Balance + 100\n"+ 
   "WHERE Id = student.Id;");

このステートメントが実行された後、Zen Control Center の ZENDB データベースの[トリガー]ノード下に Add_Balance トリガーが表示されます。

このステートメントでは、行が Students テーブルに挿入された後に更新を実行する、Add_Balance という新しいトリガーを作成しています。新しい行は、student という名前の変数によって参照されます。新しい行が挿入されると、UPDATE がトリガーされて残高を 100 増やします。トリガーをテストするために、新しい行を挿入してみましょう。

statement.execute("INSERT INTO Students(Name, Account_Balance) values ('Kim', 800)");

Account_Balance を 800 に設定したことに注目してください。行を照会すると、Account_Balance が 100 増えていることがわかります。

 1 John      100 English
 2 Mary      200 Computer Science
 3 Bob       300 English
 4 Amy       400 English
 5 Sam       500 English
 6 Jill      600 English
 7 Jim         0 English
 8 Molly     500 English
 9 Bill      500 English
10 Sue       700 Math
11 Max         0 Math
12 Fran      500 Math
13 Kim       900 Math

JDBC を使用したデータの削除

次に、ZENDB データベースと JDBC を使用して基本的な削除コマンドを実行する方法を学習します。以下のトピックについて説明します。

  • テーブルから 1 行を削除する
  • テーブルから複数の行を削除する
  • テーブルを削除する
  • データベースを削除する

ここで説明するコマンドを使用した後、行、テーブル、およびデータベースは復元できないことに留意してください。このチュートリアル後も、引き続き ZENDB データベースを使用して Actian Zen を試してみたい場合は、テーブルやデータベースを削除するコマンドを実行しないでください。

テーブルから 1 行を削除する

テーブルから特定の行を削除するには、SQL DELETE 句を使用します。

WHERE 条件を指定しないで DELETE を実行した場合は、テーブル内のすべての行が削除されます。DELETE と WHERE を組み合わせることで、削除される行を限定します。削除したい行の ID がわかっている場合は、その行のみを削除するように指定できます。

このデータベースでは、Max の行の ID は 11 です。次の例は、Max の行を削除します。

statement.execute("DELETE FROM Students WHERE Id = 11");

テーブルに Max がもうないことがわかります。

 1 John      100 English
 2 Mary      200 Computer Science
 3 Bob       300 English
 4 Amy       400 English
 5 Sam       500 English
 6 Jill      600 English
 7 Jim         0 English
 8 Molly     500 English
 9 Bill      500 English
10 Sue       700 Math
11 Fran      500 Math
12 Kim       800 Math

テーブルから複数の行を削除する

複数の行を削除するには、複数の行に該当する条件を持つ WHERE 句を指定することができます。たとえば、いくつかの行では専攻(Major)が English になっています。English を専攻とするすべての行を削除することができます。

statement.execute("DELETE FROM Students WHERE Major='English'");

1 Mary      200 Computer Science
2 Sue       700 Math
3 Fran      500 Math
4 Kim       800 Math

WHERE 句を取り除いた場合は、テーブル内のすべての行が削除されます。

テーブルを削除する

テーブルの削除は、テーブル内の行も含め、テーブル全体をデータベースから削除します。

テーブルを削除するには、SQL DROP TABLE ステートメントを使用します。

statement.execute("DROP TABLE Students");

このステートメントを実行する前に Zen Control Center を見た場合は、Students テーブルが表示されています。

ステートメントを実行した後に Zen Control Center に戻ったら、ZENDB データベースを右クリックして[更新]を選択することにより、ウィンドウを更新します。

更新されたビューでは、Students テーブルはもう表示されません。

データベースを削除する

データベース全体を削除する場合は、Zen Control Center 内で実行する必要があります。これは、JDBC ドライバーを使用してできることではありません。