スクリプト

一連の静的 SQL ステートメントを実行するには、DAO メソッドに @Script アノテーションを付けます。

@Dao
public interface EmployeeDao {
    @Script
    void createTable();
    ...
}

メソッドの戻り値の型は void でなければならず、パラメータの数は 0 でなければなりません。

スクリプト表現

ファイル内のスクリプト

エンコーディング

スクリプト ファイルは UTF-8 エンコードで保存する必要があります。

位置

スクリプト ファイルは、CLASSPATH に含まれる「META-INF」ディレクトリ以下のディレクトリに配置する必要があります。

ファイルパスの形式

スクリプト ファイルのパスは次の形式に従う必要があります。

META-INF/daoインターフェイスのパス形式/daoメソッド.script

たとえば、DAOインターフェース名が aaa.bbb.EmployeeDao 、DAOメソッド名が createTable の場合、スクリプトファイルのパスは次のようになります。

META-INF/aaa/bbb/EmployeeDao/createTable.script

特定の RDBMS への依存関係

特定の RDBMS への依存関係をファイル名で指定できます。これを行うには、拡張子「.sql」の前にハイフン「-」と RDBMS 名を置きます。たとえば、PostgreSQL に固有のファイル パスは次のとおりです。

META-INF/aaa/bbb/EmployeeDao/createTable-postgres.script

RDBMS固有のスクリプトファイルが優先されます。例えば、PostgreSQLを使用する環境では、 "META-INF/aaa/bbb/EmployeeDao/createTable.script" ではなく "META-INF/aaa/bbb/EmployeeDao/createTable-postgres.script" が選択されます。

特定の RDBMS への依存関係 も参照してください。

アノテーション内のスクリプト

@Sql アノテーションを使用して DAO メソッドにスクリプトを指定できます。

@Dao
public interface EmployeeDao {
    @Sql("create table employee (id integer, name varchar(200))")
    @Script
    void createTable();
    ...
}

アノテーション内の SQL テンプレート も参照してください。

区切り文字

スクリプトには 2 種類の区切り文字があります。

  • ステートメント区切り文字

  • ブロック区切り文字

ステートメントの区切り文字は常にセミコロン ; です。ブロック区切り文字は Dialect インスタンスによって決定されます。 RDBMS ブロック区切り文字は次のとおりです。

RDBMS

方言

ブロック区切り文字

DB2

Db2Dialect

@

H2 Database Engine 1.2.126

H212126Dialect

H2 Database

H2Dialect

HSQLDB

HsqldbDialect

Microsoft SQL Server 2008

Mssql2008Dialect

GO

Microsoft SQL Server

MssqlDialect

GO

MySQL

MySqlDialect

/

Oracle Database

OracleDialect

/

PostgreSQL

PostgresDialect

$$

SQLite

SqliteDialect

@ScriptblockDelimiter 要素にブロック区切り文字を指定することもできます。

@Script(blockDelimiter = "GO")
void createProcedure();

対応するスクリプトファイルは以下のとおりです。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[MY_PROCEDURE]
AS
BEGIN
    SET NOCOUNT ON;
END
GO

エラーによる停止

ステートメントの実行が失敗すると、スクリプトの実行は停止します。スクリプトの実行を続行するには、 haltOnError 要素に false を指定します。

@Script(haltOnError = false)
void createTable();

次のスクリプトは Oracle データベースに対して有効です。

/*
 * table creation statement
 */
create table EMPLOYEE (
  ID numeric(5) primary key,  -- identifier is not generated automatically
  NAME varchar2(20)           -- first name only
);

/*
 * insert statement
 */
insert into EMPLOYEE (ID, NAME) values (1, 'SMITH');

/*
 * procedure creation block
 */
create or replace procedure proc
( cur out sys_refcursor,
  employeeid in numeric
) as
begin
  open cur for select * from employee where id > employeeid order by id;
end proc_resultset;
/

/*
 * procedure creation block
 */
create or replace procedure proc2
( cur out sys_refcursor,
  employeeid in numeric
) as
begin
  open cur for select * from employee where id > employeeid order by id;
end proc_resultset;
/

単一行コメント -- と複数行コメント /* ... */ の両方を使用できます。各ステートメントはセミコロン ; で終わる必要があります。新しい行はステートメントの終わりを意味しないことに注意してください。

この例では、スラッシュ / がブロック区切り文字です。ブロック区切り文字は行の先頭に表示され、その後に新しい行が続く必要があります。