Метамодель - идентификация Sql Server 2008 для данных больших объектов

Мы пытаемся извлечь данные из разных баз данных в какой-то плоский формат файла, используя Apache MetaModel, С ORACLE, для LOB столбец (либо CLOB или же BLOB) мы получаем isLarge()=true, Но для того же столбца с SQL Server 2008 R2 мы получаем false для этого. В SQL Server 2008 R2 наш LOB столбец varChar(Max) для CLOB и varbinary(Max) для BLOB.

Есть ли способ обработать обе базы данных одним решением?

2 ответа

Apache MetaModel имеет системное свойство, которое вы можете установить, чтобы оно автоматически преобразовывало все CLOB-ы в строки и все BLOB-объекты в байтовые массивы.

Вы можете установить это свойство либо через строковое значение в командной строке, либо:

-Dmetamodel.jdbc.convert.lobs=true

Или вы можете сделать это из кода, в этом случае вам будет доступна удобная константа:

System.setProperty(JdbcDataContext.SYSTEM_PROPERTY_CONVERT_LOBS, true);

Удачи.

Одним из возможных подходов является использование java.sql.Types. Любая система баз данных, поддерживающая JDBC, должна надежно соответствовать этим типам.

JDBC определяет метод getMetaData, который возвращает информацию обо всех столбцах ResultSet. Ключевым методом является getColumnType, который возвращает вышеуказанный тип sql (например, 2004 для BLOB).

Вот небольшой пример использования Groovy вместо Java для проверки столбца таблицы my_tab

def stmt = con.createStatement() 

def rs = stmt.executeQuery('select * from my_tab')

def rsmd = rs.getMetaData();
def colCount = rsmd.getColumnCount()

println "getColumnCount ${colCount}"

colCount.times {i ->
  println "---------------------------------"
  println "columnName ${rsmd.getColumnName(i+1)}"
  println "columnTypeName ${rsmd.getColumnTypeName(i+1)}" 
  println "columnType ${rsmd.getColumnType(i+1)}"   
} 

результаты в

getColumnCount 3
---------------------------------
columnName C1
columnTypeName BLOB
columnType 2004

---------------------------------
columnName C2
columnTypeName CLOB
columnType 2005

---------------------------------
columnName C3
columnTypeName DATE
columnType 93

У меня нет большого опыта помимо Oracle с методом getMetaData, но, на мой взгляд, это самый простой подход для решения этой проблемы.

Другие вопросы по тегам