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」なんですが、ちゃんと認識するようにしています。
OracleやMySQLの場合は「/」を認識します。DB2はマニュアルを見てもブロックの区切りが何かわからなかったのですが、慣例的に「@」が使われているようなので「@」を採用しました。PostgreSQLもブロック区切りがないようですが、ファンクションの定義では$$が特別扱いされているようなので、これが含まれている場合はSQLブロックとみなすようにしました。
ちなみに、ブロックの区切り文字は行頭においてもらう必要があります。
exec-sqlのタスクのドキュメントはこちら。