PostGre と Amazon の RedShift で動作する SQL 製品を Oracle で動作するように移植するという急ぎの仕事があります。(「作業」は現在、「最適に」ではなく「正しく」を意味することに注意してください。)
すべての TABLE は ORM (DBI) を使用して定義されていますが、すべての VIEW は現在インライン SQL として格納されています。
私の希望は、SQL を一種の一般的な意味でカプセル化し、いくつかの既存のツールを使用してそれを方言固有の SQL に変換する比較的簡単な方法があることです。
些細な例:
SELECT CAST(x AS DECIMAL(16,4)) AS foo FROM bah
=>SELECT CAST(x AS NUMBER(16,4)) AS foo FROM bah
それは簡単でした。デプロイ時には「検索と置換の段階」があります。SQL は次のように保存され、デプロイ先の方言に応じて新しい文字列CAST(x AS #DECIMAL#(16,4))
に置き換えます。#DECIMAL#
イライラする例:
SELECT x % y AS modulo FROM foo
=>SELECT MOD(x, y) AS modulo FROM foo
と...
SELECT x / y AS int_div FROM foo
=>SELECT trunc(x / y) AS int_div FROM foo
私は PERL の専門家ではないので、ある種のマクロ展開を行う方法についての指針を探しています。
- SQL は、文字列内のある種のマクロ式とともに格納されます
- 「プロセッサー」は、「方言」および「sql」を含むパラメーターで呼び出されます
- 「方言」パラメーターは、マクロ展開の出力を指示します
ダイアレクトレス SQL:SELECT #DIV(x,y)# AS z FROM foo
方言:RedShift
出力:SELECT x / y AS z FROM foo
方言:Oracle11g
出力:SELECT floor(x / y) AS z FROM foo
サブクエリなどに対処する必要があります。
ダイアレクトレス SQL:SELECT #MOD(x, (SELECT MAX(y) FROM bah))# AS z FROM foo
方言:RedShift
出力:SELECT x % (SELECT MAX(y) FROM bah) AS z FROM foo
方言:Oracle11g
出力:SELECT mod(x, (SELECT MAX(y) FROM bah)) AS z FROM foo
または、「一般的な」SQL を格納し、それを「方言固有の」SQL に変換できる信頼できる方法。