H2Databaseを追っかけていたりしたブログ

H2 database のリリースノートを読んだりとか。

H2で動的SQLを試みる

SQLServerではプロシージャ内で、動的に生成した文字列をEXECでSQLとして実行できるらしい。DB2ではあったか記憶にないですが、Oracleにもあったような気がします。

h2では、ストアドファンクション/プロシージャ/トリガーはPL/SQL等ではなく、Javaで記述します。その際に、第一引数をConnectionにしておくと、呼ばれたときに使っているコネクションをそのまま引き渡してくれるようになっています。

ですので、下記の様にすると、動的にSQLを実行するユーザ定義関数を作成することができます。

CREATE ALIAS DYNAMIC_EXEC AS $$
ResultSet dynamicExec(Connection conn, String value) {
	try {
		return conn.createStatement().executeQuery(value);
	} catch (SQLException e) {
	}
	return null;
}
$$;

使ってみます。

create table hoge(id int,tabname varchar);
insert into hoge values (1,'foo');
insert into hoge values (2,'bar');

select * from dynamic_exec('select * from hoge');

ResultSetを返すようにすると、from句に使えて便利です。