我有一些表定义如下:
//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();
这样可以解决我的两个问题之一。现在,我仍然需要找到如何从原始嵌套表中提取元数据。