如何在StructDescriptors中的用户结构和原始类型之间进行过滤

时间:2018-08-09 17:18:58

标签: java oracle jdbc database-metadata

设置

我有一些表定义如下:

//Table 1
create type first_type as object(
  ID   NUMBER(32,0),
  NAME VARCHAR2(255 BYTE)
);
create type t_first as table of first_type;

//Table 2
create or replace type t_second as char(2);

然后我有一段看起来像这样的Java代码:

//Get the Oracle object array descriptor
ArrayDescriptor  aDesc = ArrayDescriptor.createDescriptor ( name, conn );

//Get the Oracle array descriptor
StructDescriptor sDesc = StructDescriptor.createDescriptor( aDesc.getBaseName(), conn );

//Actually use the struct definition
sDesc.getMetaData().doWork();

问题

当我使用用户定义的结构时,此代码段可以正常工作:

//This works!
aDesc = ArrayDescriptor.createDescriptor ( t_first, conn );
sDesc = StructDescriptor.createDescriptor( "FIRST_TYPE", conn );

当我使用原始类型的表时,此代码无法工作:

//This FAILS!
aDesc = ArrayDescriptor.createDescriptor ( t_second, conn );
sDesc = StructDescriptor.createDescriptor( "CHAR", conn ); //<--Exception

我觉得我需要某种方法来判断aDesc.getBaseName()是结构类型还是原始类型,但是我似乎在文档中(或者从我的多个Google搜索中)找不到类似的东西。我已经考虑过分析从失败的结构描述符中抛出的异常,但是那太可怕了,我决定首先勇敢地尝试这个站点。

最终我真正需要的是表类型的元数据。假设从两个表中都需要信息,例如其列名,其列类型,是否可为空等。理想情况下,使用上述代码可以使用API​​来检查该类型是否为基本的Oracle / SQL类型如果是用户定义的,并且使用其他API获取元数据(如表2那样是内置的)。

更新

我已经研究了一段时间了,我意识到我可以通过以下方式区分自定义类型和其他类型:

result = (aDesc.getBaseType() == Types.STRUCT) ? 
             handleStruct() : 
             handlePrimitive();

这样可以解决我的两个问题之一。现在,我仍然需要找到如何从原始嵌套表中提取元数据。

0 个答案:

没有答案