Можно ли получить метаданные о вложенной таблице / массиве из кода Java?

Обычно для определенного пользователем типа я могу просто сделать следующее (упрощенный, но функциональный пример):

//Create table
create type myType1 as object( a char(2), b char(2) );
create type myTable1 as table of myType1;

//Java code
ArrayDescriptor  des  = ArrayDescriptor.createDescriptor( "MYTABLE1", con);
StructDescriptor sDes = StructDescriptor.createDescriptor( des.getBaseName(), con);

//Populte the metadata
String  columnName = sDes.getColumnName(0);
int     oracleType = sDes.getColumnType(0);
int     maxSize    = sDes.getColumnDisplaySize(0);
boolean isNullable = sDes.isNullable(0)>0;

За исключением того, что теперь у меня есть таблица, которая определена с примитивным типом вместо структуры, и я не могу получить доступ к метаданным. Мой текущий код:

//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?

person billoot    schedule 10.08.2018    source источник


Ответы (2)


Надеюсь, я правильно вас понял. Если вы можете получить информацию о столбце, вы можете попробовать следующие коды.

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");
}
person theMind    schedule 13.08.2018
comment
Я не могу получить информацию о столбце для этой таблицы. Строка ResultSet columns = databaseMetaData.getColumns(null,null, tableName, null); возвращает пустой ResultSet. - person billoot; 13.08.2018
comment
Я обновил первый пример, чтобы лучше выделить различия. - person billoot; 13.08.2018
comment
@billie, я попробовал, и он работает. Вы уверены, что ваша связь правда. - person theMind; 16.08.2018
comment
Я снова попробовал использовать все возможные комбинации, чтобы заставить их работать, но безуспешно. ResultSet всегда пуст. Я могу использовать этот метод для получения информации о других полных таблицах, он просто не работает для массива. - person billoot; 16.08.2018

Иногда в реальной корпоративной среде, где у вас нет полномочий администратора для Oracle DB, вы не сможете полагаться на класс Java DatabaseMetaData, но можете полагаться на запросы DDL. Под этим я подразумеваю, что вы можете выполнять запросы DDL так же, как вы обычно выполняете запрос SQL в своем приложении Java.

Например:

  1. Вы можете получить тип данных столбца, выполнив следующий запрос, как показано в этом ответе: select t.data_type from user_tab_columns t where t.TABLE_NAME = 'MYTABLE1' and t.COLUMN_NAME='COLUMN_VALUE'.
  2. Вы можете узнать размер отображаемого столбца, выполнив следующий запрос, как показано в этом ответе: SELECT data_length FROM all_tab_columns WHERE table_name = 'MYTABLE1' AND column_name = 'COLUMN_VALUE'.
  3. Вы можете получить возможность нулевого значения столбца, выполнив следующий запрос, как показано в этом ответе: select nullable from user_tab_columns where table_name = 'MYTABLE1' and column_name = 'COLUMN_VALUE';.
person entpnerd    schedule 18.08.2018