Невозможно использовать SUBSTR внутри TO_DATE во встроенной базе данных Derby - PullRequest
2 голосов
/ 14 марта 2012

Я использую базу данных derby для моих тестовых случаев Maven. И я не могу использовать SUBSTR внутри TO_DATE, ошибка выдачи.

На самом деле он использовался для оригинального приложения, которое подключено к oracle db. Сейчас я пишу тестовые наборы Maven с встроенным дерби в db и не могу его выполнить. Дело в том, что я не должен изменять исходный запрос, и мне нужен обходной путь, чтобы исправить эту проблему.

Мой запрос будет таким.

SELECT TO_DATE (SUBSTR (testdate, 1, 9), 'DD-MM-RR') ИЗ тестового стола

Пожалуйста, помогите мне в этом вопросе. Спасибо.

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Substr нельзя использовать с DATE. Вы не можете не переопределить это. SQL нелегко повторно использовать между базами данных. Самая простая часть - изменить sql.

Сложнее всего углубиться в дерби:

Если вы хотите, чтобы это работало без изменения запроса, вы можете обернуть соединение или источник данных и изменить sql на более низкий уровень.

Чтобы это работало, вам необходим доступ к Connection Объекту в вашем тесте:

Connection wrapped = new WrappedConnection(originalConnection);

Это короткий пример обернутого соединения с функцией migrate (в основном это Pattern 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");
}

Но вам придется создать свою собственную функцию Derby SUBSTR_DATE.

0 голосов
/ 24 августа 2012

Я могу придумать 2 варианта ... Я не знаю, какой смысл имеет смысл, но ...

Создайте подкласс оригинала и (при условии, что строка используется только водин метод этого класса) просто переопределить этот единственный метод.и оставьте остальной код таким же.

Если класс, вызывающий этот SQL, отправит сообщение в настроенный метод tpe sendSQLStatement (String sql), это будет обрабатывать все создание объекта операторас помощью обработки ошибок try / catch и т. д. и возврата набора результатов вы можете установить в методе оверид для проверки используемого механизма БД.Эта информация может быть получена из databaseMetaData.getDatabaseProductName () или, альтернативно, из метода get .getDriverName ().Затем вы проверяете эту строку, чтобы увидеть, содержит ли она слово «derby», и если да, отправьте другой тип SQL.

Конечно, позже в будущем вам нужно будет выполнить окончательный тест, чтобы убедиться, чтооригинальный код Oracle по-прежнему работает.

Вы можете даже воспользоваться возможностью изменить весь фрагмент кода, чтобы сделать его более независимым от БД (то есть привести значение к строковому типу (или к дате с длинным), а затем выполнитьфункция подстроки.

...