Запрос Oracle для получения имен столбцов


123

У меня есть запрос mySQL для получения столбцов из такой таблицы:

String sqlStr="select column_name 
from information_schema.COLUMNS 
where table_name='users' 
and table_schema='"+_db+"' 
and column_name not in ('password','version','id')"

Как изменить указанный выше запрос в базе данных Oracle 11g? Мне нужно получить имена столбцов в качестве набора результатов для таблицы «пользователи», исключая определенные столбцы, указав схему. Прямо сейчас у меня есть все таблицы в моем новом табличном пространстве, поэтому могу ли я указать имя табличного пространства вместо имени схемы?

Есть ли для этого общий HQL? В моей новой базе данных Oracle (я новичок в Oracle) у меня есть только имя табличного пространства, так что это эквивалентно имени схемы (логически?)

Ответы:


176

Эквивалент Oracle для information_schema.COLUMNSявляется USER_TAB_COLSдля таблиц , принадлежащих текущему пользователю, ALL_TAB_COLSили DBA_TAB_COLSдля таблиц , принадлежащих всем пользователям.

Табличное пространство не эквивалентно схеме, и вам также не нужно указывать имя табличного пространства.

Предоставление схемы / имя пользователь будет полезно , если вы хотите , чтобы запрос ALL_TAB_COLSили DBA_TAB_COLSдля столбцов таблиц , принадлежащих пользователем конкретного. в вашем случае я предполагаю, что запрос будет выглядеть примерно так:

String sqlStr= "
SELECT column_name
  FROM all_tab_cols
 WHERE table_name = 'USERS'
   AND owner = '" +_db+ "'
   AND column_name NOT IN ( 'PASSWORD', 'VERSION', 'ID' )"

Обратите внимание, что при таком подходе вы рискуете SQL-инъекцией.

РЕДАКТИРОВАТЬ: имена таблиц и столбцов в верхнем регистре, поскольку в Oracle они обычно прописные; они только в нижнем или смешанном регистре, если они заключены в двойные кавычки.


2
кстати, я нашел общий способ сделать это независимо от базы данных через jdbc .. со ссылкой здесь: kodejava.org/examples/163.html
pri_dev

Мне также пришлось добавить and virtual_column = 'NO'к моему запросу.
musicin3d

101

Приведенный ниже запрос работал у меня в базе данных Oracle.

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';

26
Имейте в виду, что Oracle чувствителен к регистру. Я обычно использую ...WHERE LOWER(Table_Name) = 'mytablename';.

2
@ user565869 Я бы использовал where lower(TABLE_NAME) = lower('WHATEVER'), иначе, когда в имени таблицы есть какой-то заглавный символ, он тоже не найдет таблицу
AlexanderD

SELECT column_name FROM all_tab_cols WHERE UPPER(Table_Name) = UPPER('tablename');работает так же хорошо.
user3553260

Использование lower(TABLE_NAME)или upper(TABLE_NAME)требует, чтобы oracle сканировал ALL_TAB_COLUMNSтаблицу, чтобы получить все значения, TABLE_NAMEпрежде чем он сможет сравнить их с предоставленными UPPER('MyTableName'). При быстром тестировании это сделало производительность непригодной для моей цели, поэтому я буду придерживаться сравнения с учетом регистра.
Крис Магнусон

40

в оракуле вы можете использовать

desc users

для отображения всех столбцов, содержащихся в таблице пользователей


6
... потому что, хотя он представляет собой ответ на вопрос «как получить список всех столбцов таблицы», он не отвечает на заданный вопрос: 1) это не запрос, 2) он не ограничивает / фильтровать возвращаемые столбцы, 3) возвращает ли он набор результатов?
Ehryk

6
Отсутствие положительных отзывов - не desc usersплохой ответ на некоторые вопросы, но не лучший ответ на этот .
Ehryk

и потому что это не запрос sql, а команда sql * plus. проверьте это для получения дополнительной информации: stackoverflow.com/questions/37133666/…
01000001

7

Вы можете попробовать это: (Он работает на 11g и возвращает все имена столбцов из таблицы, здесь test_tbl - это имя таблицы, а user_tab_columns - разрешенные пользователем столбцы таблицы)

select  COLUMN_NAME  from user_tab_columns
where table_name='test_tbl'; 


1
USER_TAB_COLUMNSна самом деле столбцы таблиц, принадлежащих пользователю, а не столбцы таблиц, разрешенных пользователю.
Дэвид Фабер

2

Запрос для использования с Oracle:

String sqlStr="select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='"+_db+".users' and COLUMN_NAME not in ('password','version','id')"

Никогда не слышал о HQL для таких запросов. Я полагаю, что реализациям ORM не имеет смысла справляться с этим. ORM - это объектно-реляционное сопоставление, и вы ищете сопоставление метаданных ... Вы бы не использовали HQL, а использовали бы методы API для этой цели или прямой SQL. Например, вы можете использовать JDBC DatabaseMetaData .

Я думаю, что табличное пространство не имеет ничего общего со схемой. Табличные пространства AFAIK в основном используются для логических внутренних технических целей, которые должны беспокоить администраторов баз данных. Дополнительные сведения о табличных пространствах см. В документации Oracle .


TABLE_NAME='"+_db+".users'не удастся; вам нужно разделить владельца / схему и имя таблицыALL_TAB_COLUMNS
Дэвид Фабер

2

Единственный способ получить имена столбцов - использовать следующий запрос:

select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'

2

Дело в том, что в жабе вам нужно написать заглавную букву имени таблицы, например:

select *
FROM all_tab_columns
where table_name like 'IDECLARATION';

1

Я считаю это полезным в Oracle:

SELECT 
    obj.object_name, 
    atc.column_name, 
    atc.data_type, 
    atc.data_length 
FROM 
    all_tab_columns atc,
    (SELECT 
        * 
     FROM 
         all_objects
     WHERE 
        object_name like 'GL_JE%'
        AND owner = 'GL'
        AND object_type in ('TABLE','VIEW')   
    ) obj
WHERE 
    atc.table_name = obj.object_name
ORDER BY 
    obj.object_name, 
    atc.column_name;

Этот ответ очень трудно прочитать. Пожалуйста, подумайте о переформатировании.
chharvey 02

Что делать, если есть несколько таблиц с одинаковым именем, но разными владельцами?
Дэвид Фабер

1

В некоторых случаях нам понадобится список всех столбцов из таблицы в схеме, разделенный запятыми. В таких случаях мы можем использовать эту универсальную функцию, которая извлекает список, разделенный запятыми, в виде строки.

CREATE OR REPLACE FUNCTION cols(
    p_schema_name IN VARCHAR2,
    p_table_name  IN VARCHAR2)
  RETURN VARCHAR2
IS
  v_string VARCHAR2(4000);
BEGIN
  SELECT LISTAGG(COLUMN_NAME , ',' ) WITHIN GROUP (
  ORDER BY ROWNUM )
  INTO v_string
  FROM ALL_TAB_COLUMNS
  WHERE OWNER    = p_schema_name
  AND table_name = p_table_name;
  RETURN v_string;
END;
/

Итак, простой вызов функции из запроса дает строку со всеми столбцами.

select cols('HR','EMPLOYEES') FROM DUAL;

EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID

Примечание: LISTAGG завершится ошибкой, если общая длина всех столбцов превышает количество 4000символов, что бывает редко. В большинстве случаев это сработает.


0
  1. SELECT * FROM <SCHEMA_NAME.TABLE_NAME> WHERE ROWNUM = 0;-> Обратите внимание, что это результат запроса, ResultSet. Это можно экспортировать в другие форматы. И вы можете экспортировать результат запроса в Textформат. Когда я это сделал, экспорт выглядит так SELECT * FROM SATURN.SPRIDEN WHERE ROWNUM = 0;:

    "SPRTELE_PIDM" "SPRTELE_SEQNO" "SPRTELE_TELE_CODE" "SPRTELE_ACTIVITY_DATE" "SPRTELE_PHONE_AREA" "SPRTELE_PHONE_NUMBER" "SPRTELE_PHONE_EXT" "SPRTELE_STATUS_IND" "SPRTELE_ATYP_CODE" "SPRTELE_ADDR_SEQNO" "SPRTELE_PRIMARY_IND" "SPRTELE_UNLIST_IND" "SPRTELE_COMMENT" "SPRTELE_INTL_ACCESS" "SPRTELE_DATA_ORIGIN" "SPRTELE_USER_ID" «SPRTELE_CTRY_CODE_PHONE "" SPRTELE_SURROGATE_ID "" SPRTELE_VERSION "" SPRTELE_VPDI_CODE "

  2. DESCRIBE <TABLE_NAME> -> Примечание: это вывод скрипта.


-1

Вы можете использовать приведенный ниже запрос, чтобы получить список имен таблиц, в которых используется конкретный столбец в DB2:

SELECT TBNAME                
FROM SYSIBM.SYSCOLUMNS       
WHERE NAME LIKE '%COLUMN_NAME'; 

Примечание: замените COLUMN_NAMEздесь имя столбца, который вы ищете.


Возможно, вам стоит поискать ответы на вопросы о DB2? Я сомневаюсь, что кому-то, ищущему Oracle, понадобится ответ DB2.
RichardTheKiwi

1
Этот ответ мне действительно помог. Я использую DB2 в режиме Oracle, и он не поддерживает all_tab_cols.
wm_eddie

-1

Вы можете попробовать это:

описать "Имя таблицы"

Он вернет все имена столбцов и типы данных

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.