Asakusa Framework Advent Calendar 2019の7日目、SQLをAsakusaFWに変換するポイントについてです。
SQLのINSERT文は、VALUESを使う構文とSELECTを使う構文があります。
まずINSERT-SELECTですが、これはSELECTした結果をINTOで示されたテーブルに入れるものなので、SELECT文をAsakusaFWに変換するのと同様(出力先データモデルが違うだけ)です。
一方、INSERT-VALUESは入力が何も無い状態からデータを出力することになりますが、AsakusaFWでは入力が無い場合の処理を記述することは出来ません。
(core.empty演算子は空のデータを出力しますが、それと似て1レコードだけ出力するcore.oneみたいな演算子が欲しいなーと思っているのですが^^;)
ただ、ダミーで1レコードだけ存在しているファイルをジョブフローの入力とし、それをExtract演算子に渡せば、Extract演算子は自由に複数レコード出力することが出来るので、INSERT-VALUESを実現できます。
それと、テーブル定義のデフォルト値の仕組みはAsakusaFWには無いので、VALUESで指定されていない項目に対するデフォルト値は自分でセットする必要があります。
これは簡単だから特に問題ないのですが、問題は、IDの自動採番の仕組みです。
AsakusaFWは分散して処理するので、全体を通して一意になる値を採番することは出来ません。
処理を行うサーバーのホスト名やUUIDなんかを組み合わせれば一意にすることは出来ますが、RDBの自動採番はほぼ数値なので、直接的な代替にはなりませんよね…。
なので、Oracle用ですが、そこだけJDBC接続してOracleのシーケンスで採番するユーティリティーを作ってみました。