我正在使用derby嵌入式数据库来处理我的Maven测试用例。而且我无法在TO_DATE内使用SUBSTR,它给出错误。
实际上它用于连接到oracle db的原始应用程序。现在我正在编写Maven测试用例,使用derby嵌入式db并且无法执行此操作。问题是我不应该修改原始查询,我需要一些解决方法来纠正这个问题。
我的查询将是这样的。
SELECT TO_DATE(SUBSTR(testdate,1,9),'DD-MM-RR')FROM testtable
请帮我解决这个问题。感谢。
答案 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开始的日期),然后执行子字符串函数。