我们正在尝试使用Apache MetaModel
将来自不同数据库的数据提取为某种平面文件格式。使用ORACLE
,对于LOB
列(CLOB
或BLOB
),我们得到isLarge()=true
。但对于SQL Server 2008 R2
的同一列,我们会收到false
。在SQL Server 2008 R2
我们的LOB
列为varChar(Max)
用于CLOB,varbinary(Max)
用于BLOB。
有没有办法用一个解决方案处理这两个数据库?
答案 0 :(得分:0)
Apache MetaModel有一个系统属性,您可以设置该属性,使其自动将所有CLOB转换为字符串,将所有BLOB转换为字节数组。
您可以通过命令行上的字符串值等设置此属性:
-Dmetamodel.jdbc.convert.lobs=true
或者您可以通过代码完成此操作,在这种情况下,您可以使用方便的常量:
System.setProperty(JdbcDataContext.SYSTEM_PROPERTY_CONVERT_LOBS, true);
祝你好运。
答案 1 :(得分:-1)
一种可能的方法是使用java.sql.Types。任何支持JDBC的数据库系统都应该可靠地映射到这种类型。
JDBC定义getMetaData方法,该方法返回有关ResultSet的所有列的信息。关键方法是返回上述sql类型的getColumnType(例如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
除了使用getMetaData方法,我在Oracle之外没有多少经验,但在我看来,这是解决此问题的最简单方法。