4

如果您有一个表,其列的类型为 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 类型的一行,并且该行包含基本类型和基本类型名称。

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

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

4

0 回答 0