Как эмулировать ROWNUM Oracle в H2 - PullRequest
0 голосов
/ 26 декабря 2018

Я использую базу данных H2 для тестирования, но для производства я использую Oracle.Я пытаюсь использовать следующий запрос.

SELECT ROWNUM as id, name, state FROM info;

со следующей конфигурацией

public class DatabaseConfiguration {

    private final static DriverManagerDataSource dataSource = initializeDataSource();

    @Bean
    @Profile("test")
    public DataSource dataSource() {

         return dataSource;
    }

    private static DriverManagerDataSource initializeDataSource() {

        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.h2.Driver");
        dataSource.setUrl("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1;MODE=Oracle;");
        dataSource.setUsername("sa");
        dataSource.setPassword("sa");

        return dataSource;
    }
}

Но я получаю java.util.NoSuchElementException.H2 поддерживает ROWNUM?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Нет, H2 не поддерживает синтаксис ROWNUM.Он обеспечивает функцию ROWNUM() , которая может использоваться для достижения тех же целей, но она не идентична ни синтаксически, ни поведенчески.

IЯ использую базу данных H2 для тестирования, но для производства я использую Oracle.

Лучший ответ на ваш вопрос: не используйте другую СУБД для разработки .Неисчерпывающий, не подробный список возможных вариантов использования Oracle для разработки:

  • Использование Oracle Express локально.Он не полностью функционален (например, у него нет полной версии Oracle Spatial.), Но если ваше использование ограничено доступными функциями, этого может быть достаточно.Кроме того, похоже, что в настоящее время для установки Windows доступно только 11g, то есть вам потребуется виртуальная машина для размещения 18.
  • Установите Amazon RDS экземпляр только для разработки.Самые дешевые экземпляры в регионах США стоят менее 350 долларов в год, и вы, вероятно, сможете справиться с этими более дешевыми экземплярами, если вы серьезно рассматриваете БД в памяти как замену.Это почти наверняка меньше, чем вам платят за пару 8-часовых рабочих дней.Вероятно, оно того стоит по сравнению с потерей времени на работу с двумя разными RDBMS (или даже на использование Express с его ограничениями).Ваша компания может даже избавиться от этого, отключив БД ночью или что-то в этом роде.
  • Запросите отдельную базу данных и экземпляр на существующем сервере Oracle и выделите его.к развитию.Это потребовало бы наличия достаточного количества оборудования и того, чтобы оно было настроено с жесткими ограничениями на обработку и дисковое пространство, чтобы оно не поглощало слишком много ресурсов.
  • Там является своего рода разработчикомсоглашение о лицензировании, но условия действительно странные , по-видимому.

Или рассмотрите возможность перехода на другую RDBMS, которая лучше поддерживает разработку, если проект еще рано.MS SQL Server отлично справляется с этой задачей благодаря своей редакции Express, а PostgreSQL и MySQL даже лучше, поскольку они везде бесплатны.Кроме того, намного проще найти бесплатную документацию и помощь по этим базам данных, чем в Oracle.

В любом случае, найдите способ реально использовать одну и ту же технологию баз данных как для разработки, так и для производства.Время разработки, вероятно, является одним из самых дорогих ресурсов вашей компании, и создание / ведение базы данных H2, которая никогда не будет продвигаться, не является хорошим использованием этого ресурса (или ресурсов QA или чьего-либо времени и усилий).

ЕслиВаш вопрос не завершен, и вы фактически используете H2 для чего-то иного, чем просто разработка, затем настройте свой код так, чтобы он использовал отдельные запросы для каждой СУБД.Каждая СУБД имеет свой собственный диалект SQL.Это огромная ошибка - пытаться использовать один и тот же запрос для разных РСУБД.Даже если синтаксис работает в обоих случаях, у них будут разные доступные функции, и характеристики производительности вряд ли будут одинаковыми ни для чего, кроме простейших запросов.Используйте отдельные запросы.

0 голосов
/ 26 декабря 2018

Как и в случае ROWID, ROWNUM - специфическая вещь только для Oracle.

Но вы можете добиться того же результата, используя:

SELECT rownum(), name, state FROM info

rownum() - системная функция H2, Смотри здесь

...