【问题标题】:Unable to use SUBSTR inside TO_DATE in Derby Embedded Database无法在 Derby 嵌入式数据库的 TO_DATE 内使用 SUBSTR
【发布时间】:2012-03-14 07:23:31
【问题描述】:

我正在为我的 Maven 测试用例使用 derby 嵌入式数据库。而且我无法在 TO_DATE 中使用 SUBSTR,它给出了错误。

实际上它用于连接到 oracle db 的原始应用程序。现在我正在编写 Maven 测试用例,带有 derby 嵌入式数据库并且无法执行这个。问题是我不应该修改原始查询,我需要一些解决方法来纠正这个问题。

我的查询会是这样的。

从测试表中选择 TO_DATE (SUBSTR (testdate, 1, 9), 'DD-MM-RR')

请帮助我解决这个问题。谢谢。

【问题讨论】:

  • 错误是“'DATE' 类型不允许使用 'SUBSTR' 函数。”
  • 我可以覆盖 DERBY Embedded 数据库中的 SUBSTR() 函数吗?

标签: derby


【解决方案1】:

Substr 不能与 DATE 一起使用。你不能不覆盖它。 SQL 不容易在数据库之间重用。最简单的部分就是改sql。

更难的是深入德比:

如果您想在不更改查询的情况下完成这项工作,您可以包装连接或数据源并在较低级别更改 sql。

为此,您需要访问测试中的 Connection 对象:

Connection wrapped = new WrappedConnection(originalConnection);

这是一个包装连接的简短示例,带有migrate 函数(这基本上是Adapter Pattern

public class WrappedConnection implements Connection
{

  private final Connection origConnection;


  public WrappedConnection(Connection rv)
  {
    origConnection = rv;
  }

  //I left out other methods, that you have to implement accordingly

  public PreparedStatement prepareStatement(String pSql) throws SQLException
  {
    //this you have to implement yourself
    //this will serve as a bridge between oracle and derby
    String sql = migrate(sql); 

    return sql;
  }
}

migrate 函数可以是这样的:

public String migrate(String sql)
{
   return sql.replace("SUBSTR", "SUBSTR_DATE");
}

但您必须create your own Derby FunctionSUBSTR_DATE。

【讨论】:

    【解决方案2】:

    我可以想到 2 个选项...我不知道这两个选项有多大意义,但是...

    创建原始的子类,并且(假设该行仅用于该类的一个方法中)简单地覆盖该单个方法。其余代码保持不变。

    如果调用此 SQL 的类将消息发送到自定义的 'sendSQLStatement(String sql) tpe 方法,这将处理语句对象的所有创建,包括 try / catch 错误处理等,并返回结果集,您可以在方法中设置一个覆盖来检查正在使用的数据库引擎。 此信息可从 databaseMetaData.getDatabaseProductName() 或从 get .getDriverName() 方法获得。然后测试这个字符串,看它是否包含单词“derby”,如果是,则发送不同类型的 SQL。

    当然,稍后您将需要执行最终测试以确保原始 Oracle 代码仍然有效。

    您甚至可以借此机会修改整个代码 sn-p 以使其更加与 DB 无关(即将值转换为字符串类型(或长日期中的日期),然后执行子字符串函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 2015-10-19
      • 2012-01-06
      • 2018-05-14
      • 2013-05-21
      • 1970-01-01
      • 2018-02-26
      相关资源
      最近更新 更多