Apache Derby: получение имен столбцов для пустой таблицы

В JDBC метаданные не установлены, если набор результатов пуст, поэтому я не могу выполнить getColumnNames().

Я попытался запросить системные таблицы дерби:

Таблица SYS.SYSTABLES содержит REFERENCEID, COLUMNAME, COLUMNUMBER, ...

COLUMNAME это то, что я ищу. Но я не вижу возможности объединить эту таблицу с SYS.SYSTABLES или любой другой таблицей.


person Ginkgochris    schedule 15.12.2011    source источник
comment
Вы УВЕРЕНЫ, что ResultSetMetaData не установлен, если набор результатов пуст? Я почти уверен, что большинство инструментов получают информацию о столбцах с помощью ResultSetMetaData, поэтому я удивлен, услышав это.   -  person Bryan Pendleton    schedule 15.12.2011


Ответы (3)


Вы можете объединять системные таблицы и системные столбцы с помощью TABLEID = REFERENCEID

select TABLENAME,COLUMNNAME, t.* 
FROM sys.systables t, sys.syscolumns 
WHERE TABLEID = REFERENCEID and tablename = 'SYSCOLUMNS'

 TABLENAME  COLUMNNAME         REFERENCEID                          COLUMNNAME         COLUMNNUMBER COLUMNDATATYPE                                   COLUMNDEFAULT COLUMNDEFAULTID AUTOINCREMENTVALUE AUTOINCREMENTSTART AUTOINCREMENTINC
 ---------- ------------------ ------------------------------------ ------------------ ------------ ------------------------------------------------ ------------- --------------- ------------------ ------------------ ----------------
 SYSCOLUMNS AUTOINCREMENTINC   8000001e-00d0-fd77-3ed8-000a0a0b1900 AUTOINCREMENTINC              9 BIGINT                                           NULL          NULL                          NULL               NULL             NULL
 SYSCOLUMNS AUTOINCREMENTSTART 8000001e-00d0-fd77-3ed8-000a0a0b1900 AUTOINCREMENTSTART            8 BIGINT                                           NULL          NULL                          NULL               NULL             NULL
 SYSCOLUMNS AUTOINCREMENTVALUE 8000001e-00d0-fd77-3ed8-000a0a0b1900 AUTOINCREMENTVALUE            7 BIGINT                                           NULL          NULL                          NULL               NULL             NULL
 SYSCOLUMNS COLUMNDATATYPE     8000001e-00d0-fd77-3ed8-000a0a0b1900 COLUMNDATATYPE                4 org.apache.derby.catalog.TypeDescriptor NOT NULL NULL          NULL                          NULL               NULL             NULL
 SYSCOLUMNS COLUMNDEFAULT      8000001e-00d0-fd77-3ed8-000a0a0b1900 COLUMNDEFAULT                 5 java.io.Serializable                             NULL          NULL                          NULL               NULL             NULL
 SYSCOLUMNS COLUMNDEFAULTID    8000001e-00d0-fd77-3ed8-000a0a0b1900 COLUMNDEFAULTID               6 CHAR(36)                                         NULL          NULL                          NULL               NULL             NULL
 SYSCOLUMNS COLUMNNAME         8000001e-00d0-fd77-3ed8-000a0a0b1900 COLUMNNAME                    2 VARCHAR(128) NOT NULL                            NULL          NULL                          NULL               NULL             NULL
 SYSCOLUMNS COLUMNNUMBER       8000001e-00d0-fd77-3ed8-000a0a0b1900 COLUMNNUMBER                  3 INTEGER NOT NULL                                 NULL          NULL                          NULL               NULL             NULL
 SYSCOLUMNS REFERENCEID        8000001e-00d0-fd77-3ed8-000a0a0b1900 REFERENCEID                   1 CHAR(36) NOT NULL                                NULL          NULL                          NULL               NULL             NULL
person oers    schedule 15.12.2011

Используйте DatabaseMetaData.getColumns()

person a_horse_with_no_name    schedule 15.12.2011

person    schedule
comment
Хотя этот фрагмент кода может быть решением, включая объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причины вашего предложения кода. - person nircraft; 21.06.2019
comment
используются эти библиотеки import import java.sql.ResultSet; импортировать java.sql.SQLException; импортировать java.sql.Statement; импортировать java.sql.ResultSetMetaData; это метод, который принимает переменную строку, запрашивает базу данных для всех столбцов в таблице, которые соответствуют этой строке, затем сохраняет ее в объекте набора результатов, из которого он создает объект метаданных набора результатов, чтобы узнать, сколько столбцов существует в таблице. Затем использует цикл for, который инициализируется единицей с количеством столбцов в качестве условия проверки. То есть мы можем передать итерацию цикла в getColumnName без переполнения. - person guest; 21.06.2019