如何在可移植的 JDBC

问题描述

如果你有一个表的列的类型是 sql ARRAY,你如何找到数组类型的基类型,也就是数组类型的单个元素的类型?

  • 您如何在与供应商无关的纯 JDBC 中执行此操作?
  • 如何在不获取和检查实际行数据的情况下执行此操作?等效地:如果表是空的怎么办?

这里问了类似的问题:

但是,我要求通过 JDBC API 本身采用一种与供应商无关的方式。我在问:应该如何使用与供应商无关的纯 JDBC 解决这个问题?这个用例看起来像是JDBC的一个核心用例,我真的很惊讶我在JDBC中找不到解决方案。

我花了几个小时阅读和重新阅读 JDBC API javadocs,还有几个小时在互联网上搜索,我非常惊讶似乎没有通过 JDBC API 执行此操作的正确方法。它应该通过 DatabaseMetaData 或 ResultSetMetaData 就在那里,但显然不是。

以下是我发现的不足的解决方法和替代方法

  • 获取一些行,直到获得具有该列实际值的行,获取列值,转换为 java.sql.Array,然后调用 getBaseType。
  • 对于 postgres,假设 sql ARRAY 类型名称编码为 ("_" + baseTypeName)。
  • 对于 Oracle,请使用 Oracle 特定的扩展来获取答案。
  • 某些数据库一个特殊的“element_types”视图,其中包含当前表等使用的每个 sql ARRAY 类型的一行,并且该行包含基本类型和基本类型名称

我的背景是,我想在我公司产品的云中的 spark 中使用供应商提供的 JDBC 连接器,并且元数据发现变得很重要。我还在研究为其他没有 JDBC 驱动程序或 spark 连接器的数据源自己编写 JDBC 连接器的可行性。元数据发现很重要,这样人们就可以正确定义 Spark InternalRow 和 Spark-JDBC 数据获取器。目前,Spark-JDBC 对 sql ARRAY 和 sql STRUCT 的支持非常有限,但我设法通过一两天的编码提供了缺失的位,但在此过程中我遇到了这个阻碍我的问题。如果我可以控制 JDBC Driver 实现,那么我可以使用 kludge(即在类型名称中编码类型信息,并在 Spark JdbcDialect 中获取类型名称并将其解码以创建 Catalyst 类型)。但是,我想以正确的 JDBC 方式来执行此操作,而且我希望以其他一些供应商提供的 JDBC 驱动程序支持的方式来执行此操作。

PS:我花了惊人的时间来定位 DatabaseMetaData.getAttributes()。如果我没看错,这可以为我提供 sql STRUCT 的字段/属性名称和类型。同样,我很惊讶我可以在与供应商无关的纯 JDBC 中获得 sql STRUCT 的字段/属性名称和类型,但在与供应商无关的纯 JDBC 中无法获得 sql ARRAY 的基本类型。>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...