无法在Derby嵌入式数据库中的TO_DATE内使用SUBSTR

时间:2012-03-14 07:23:32

标签: derby

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

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

我的查询将是这样的。

SELECT TO_DATE(SUBSTR(testdate,1,9),'DD-MM-RR')FROM testtable

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

2 个答案:

答案 0 :(得分:1)

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

更难的部分是深入德比:

如果要在不更改查询的情况下完成此工作,可以包装连接或DataSource并在较低级别更改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 Function SUBSTR_DATE。

答案 1 :(得分:0)

我可以想到两个选项......我不知道有多少意义,但......

创建原始子类,并(假设该行仅用于该类的一个方法)只需覆盖该单个方法。并保留其余代码相同。

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

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

您甚至可以利用这个机会修改整个代码片段,使其更加与数据库无关(即将值转换为字符串类型(或从long开始的日期),然后执行子字符串函数。