Мне нужно обрабатывать наборы результатов, возвращающие хранимые процедуры / функции для трех баз данных (Oracle, sybase, MS-Server). Процедуры / функции в целом такие же, но вызов в Oracle немного отличается.
statement.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
...
statement.execute();
ResultSet rs = (ResultSet)statement.getObject(1);
JDBC не предоставляет универсального способа справиться с этим, поэтому мне нужно различать разные типы баз данных в моем коде. Мне дано соединение, но я не знаю, как лучше всего определить, является ли БД оракулом. Я могу использовать имя драйвера, но предпочитаю найти более чистый способ.




Я подозреваю, что вы захотите использовать класс DatabaseMetaData. Скорее всего, будет достаточно DatabaseMetaData.getDatabaseProductName, хотя вы также можете использовать метод getDatabaseProductVersion, если у вас есть код, который зависит от конкретной версии конкретной базы данных, с которой вы работаете.
PostgreSQL дает "PostgreSQL"
MySQL предоставляет «MySQL», а HSQLDB дает «HSQL Database Engine».
Дерби дает "Apache Derby"
Есть ли перечисление, которое мы могли бы использовать для сравнения?
Большинство других значений перечислены в этом ответе: stackoverflow.com/questions/9320200/…
H2 дает «H2».
Вы можете использовать org.apache.ddlutils, класс Platformutils:
databaseName = new PlatformUtils().determineDatabaseType(dataSource)
В Microsoft SQL Server в качестве названия продукта используется «Microsoft SQL Server».