S2JDBC-Genの紹介 その7 − 任意のSQLの実行

exec-sqlというAntタスクがあって、SQLスクリプトが記述されたファイルを複数指定して実行できます。
スクリプトの中には、SQLステートメントだけではなく、SQLのブロック、1行コメント、ブロックコメントなどが含まれていても大丈夫です。SQLブロックというのは、ストアドとか複数ステートメントを含んだひとつの塊のことを指しています(正式名称が他にあるのかも?)。
単一のトランザクションで実行することも可能です。

任意のSQLの実行

ビルドファイルの定義はこんなかんじ。

    <exe-sql
      transactional="true"
      classpathref="classpath">
        <sqlFileList dir="sql">
          <file name="aaa.sql"/>
          <file name="bbb.sql"/>
          <file name="ccc.sql"/>
        </sqlFileList>
    </exe-sql>

たとえば、SQL Serverを使っている場合にaaa.sqlの中で次のように記述できます。

--1行コメントが書ける
create table ADDRESS (ID int identity not null, CITY varchar(255), constraint ADDRESS_PK primary key(ID));

/*
 * ブロックコメントもかける
 */
CREATE FUNCTION [dbo].[FUNC_SIMPLETYPE_PARAM] ( --ここにコメントもOK
    @param1 int)
RETURNS int
AS
BEGIN
    RETURN 20; /* こんな変なブロックコメントもOK
                */
END
GO

SQL Serverの場合、ブロックの区切りは「GO」なんですが、ちゃんと認識するようにしています。
OracleMySQLの場合は「/」を認識します。DB2はマニュアルを見てもブロックの区切りが何かわからなかったのですが、慣例的に「@」が使われているようなので「@」を採用しました。PostgreSQLもブロック区切りがないようですが、ファンクションの定義では$$が特別扱いされているようなので、これが含まれている場合はSQLブロックとみなすようにしました。

ちなみに、ブロックの区切り文字は行頭においてもらう必要があります。

exec-sqlのタスクのドキュメントはこちら。