0

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 に変換できる信頼できる方法。

4

1 に答える 1

3

これにはSQL::Translatorモジュールが役立つかもしれません。

SQL::Translator は、ベンダー固有の SQL テーブル定義を他のベンダー固有の SQL、ER ダイアグラム、ドキュメント (POD および HTML)、XML、および Class::DBI クラスなどの他の形式に変換する Perl モジュールのグループです。

于 2015-01-12T13:52:54.313 に答える