是否可以从Java代码中获取嵌套表/数组上的元数据?

是否可以从Java代码中获取嵌套表/数组上的元数据?,java,oracle,jdbc,nested-table,Java,Oracle,Jdbc,Nested Table,通常,对于用户定义的类型,我可以简单地执行以下操作(简化但功能性的示例): 除了现在我有一个用基元类型而不是结构定义的表,而且我似乎无法访问元数据。我目前的代码是: //Create table create or replace type myTable2 as table of char(2); //Java code ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor( "MYTABLE2", con); //Thi

通常,对于用户定义的类型,我可以简单地执行以下操作(简化但功能性的示例):

除了现在我有一个用基元类型而不是结构定义的表,而且我似乎无法访问元数据。我目前的代码是:

//Create table
create or replace type myTable2 as table of char(2);

//Java code
ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor( "MYTABLE2", con);
//This next line would throw an exception, as CHAR type is not a structure
//StructDescriptor sDes = StructDescriptor.createDescriptor( des.getBaseName(), con);

//Populte the metadata    
int     oracleType = descriptor.getBaseType(); // This Works
String  columnName = "COLUMN_VALUE";           // This Works (I think)
int     maxSize    = ????                      // How do I access the '2'?
boolean isNullable = ????                      // How do I access isNullable?

我希望我对你的理解是正确的。如果您可以获得列信息,您可以尝试以下代码

DatabaseMetaData databaseMetaData = connection.getMetaData();

ResultSet columns = databaseMetaData.getColumns(null,null, tableName, null);
while(columns.next())
{
    String columnName = columns.getString("COLUMN_NAME");
    String datatype = columns.getString("DATA_TYPE");
    String columnsize = columns.getString("COLUMN_SIZE");
    String decimaldigits = columns.getString("DECIMAL_DIGITS");
    String isNullable = columns.getString("IS_NULLABLE");
    String is_autoIncrment = columns.getString("IS_AUTOINCREMENT");
}

有时,在Oracle DB上没有管理员权限的真实企业环境中,您可能无法依赖Java的
DatabaseMetaData
类,但可以依赖DDL查询。我的意思是,您可以像在Java应用程序中运行SQL查询一样执行DDL查询

例如:

  • 您可以通过执行以下查询来获取列的数据类型,如所示:
    从用户选项卡中选择t.data\u type\u columns t,其中t.TABLE\u NAME='MYTABLE1'和t.column\u NAME='column\u VALUE'
  • 您可以通过执行以下查询来获取列的显示大小,如中所示:
    从所有的\u选项卡\u列中选择数据\u长度,其中table\u name='MYTABLE1'和column\u name='column\u VALUE'
  • 您可能可以通过执行以下查询来获得该列的可空性,如所示:
    从user_tab_列中选择可空,其中table_name='MYTABLE1'和column_name='column_VALUE'

  • 我无法获取此表的列信息。行
    ResultSet columns=databaseMetaData.getColumns(null,null,tableName,null)
    返回一个空的
    结果集。
    。我更新了第一个示例,以便更好地突出显示差异。@billie我试过了,效果很好。你确定你的联系是真的吗?我用我能想到的每一种组合都试过了,但没有成功。
    ResultSet
    始终为空。我可以使用这个方法来获取关于其他完整表的信息,但它对数组不起作用。
    DatabaseMetaData databaseMetaData = connection.getMetaData();
    
    ResultSet columns = databaseMetaData.getColumns(null,null, tableName, null);
    while(columns.next())
    {
        String columnName = columns.getString("COLUMN_NAME");
        String datatype = columns.getString("DATA_TYPE");
        String columnsize = columns.getString("COLUMN_SIZE");
        String decimaldigits = columns.getString("DECIMAL_DIGITS");
        String isNullable = columns.getString("IS_NULLABLE");
        String is_autoIncrment = columns.getString("IS_AUTOINCREMENT");
    }