我们在一个项目中使用Oracle,希望也支持MySQL。它们的SQL方言有多接近呢?是否可能在不进行太多操作的情况下同时使用相同的SQL源代码呢?
详细信息如下:
- 我们使用iBatis作为持久化管理器,将SQL语句清晰地分离到资源文件中。但我们在SQL级别上工作,这有其优点(和缺点)。 - 我们不想转向像Hibernate这样的对象关系映射器,它可以完全屏蔽我们之间的方言差异。 - 我们努力保持使用通用的Oracle SQL子集。 - 没有PL/SQL。 - 我们不使用存储过程或触发器(目前还没有)。 - 我们使用检查约束、唯一约束和外键约束。 - 我们使用ON DELETE CASCADEs。 - 我们使用事务(在iBatis API级别完成)。 - 我们在查询中调用了一些Oracle时间戳函数。 - 我们将使用MySQL的InnoDB存储引擎(它支持事务和约束)。
那么你有什么想法呢?我们需要维护两个不同的iBatis SQL资源文件集合,一个针对每种方言,还是可能有一个支持MySQL和Oracle的单一SQL集合呢?
最终更新:感谢所有答案,特别是指向Troels Arvin关于差异的页面的指针。遗憾的是标准不够标准。对我们来说,问题在于MySQL自增与Oracle序列、MySQL LIMIT与Oracle Rowumber()以及一两个奇怪的函数之间的差异。大多数其他内容应该很容易转移,除了一些编辑,以确保我们使用SQL-92,正如@mjv所指出的那样。更大的问题是,某些查询可能需要在每个DBMS中手动进行不同的优化。
详细信息如下:
- 我们使用iBatis作为持久化管理器,将SQL语句清晰地分离到资源文件中。但我们在SQL级别上工作,这有其优点(和缺点)。 - 我们不想转向像Hibernate这样的对象关系映射器,它可以完全屏蔽我们之间的方言差异。 - 我们努力保持使用通用的Oracle SQL子集。 - 没有PL/SQL。 - 我们不使用存储过程或触发器(目前还没有)。 - 我们使用检查约束、唯一约束和外键约束。 - 我们使用ON DELETE CASCADEs。 - 我们使用事务(在iBatis API级别完成)。 - 我们在查询中调用了一些Oracle时间戳函数。 - 我们将使用MySQL的InnoDB存储引擎(它支持事务和约束)。
那么你有什么想法呢?我们需要维护两个不同的iBatis SQL资源文件集合,一个针对每种方言,还是可能有一个支持MySQL和Oracle的单一SQL集合呢?
最终更新:感谢所有答案,特别是指向Troels Arvin关于差异的页面的指针。遗憾的是标准不够标准。对我们来说,问题在于MySQL自增与Oracle序列、MySQL LIMIT与Oracle Rowumber()以及一两个奇怪的函数之间的差异。大多数其他内容应该很容易转移,除了一些编辑,以确保我们使用SQL-92,正如@mjv所指出的那样。更大的问题是,某些查询可能需要在每个DBMS中手动进行不同的优化。