繁体   English   中英

使用PERL的SQL方言翻译

[英]SQL Dialect Translation Using PERL

我急着要一个可以在PostGre和Amazon的RedShift上运行的SQL产品,并移植到Oracle上。 (请注意,“工作”当前并不意味着“最佳”,而是“正确”。)

我们所有的表都是使用ORM(DBI)定义的,但是我们所有的VIEW当前都存储为嵌入式SQL。

我希望有一种相对简单的方法,可以从某种通用的角度运行封装SQL,并使用一些现有工具将其转换为Dialect Specific 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”在内的参数调用“处理器”
-参数“ dialect”将指示宏扩展的输出

无方言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


它需要处理子查询等:

Dialectless-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的任何可靠方法。

您可能会发现SQL :: Translator模块对此有用。

SQL :: Translator是一组Perl模块,可将特定于供应商的SQL表定义转换为其他格式,例如其他特定于供应商的SQL,ER图,文档(POD和HTML),XML和Class :: DBI类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM