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

96

У меня есть запрос 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) у меня есть только имя табличного пространства, что эквивалентно имени схемы (логически?)

Теги:

12 ответов

152
Лучший ответ

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

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

Предоставление схемы/имени пользователя было бы ALL_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.

EDIT: верхние имена table- и столбцов, поскольку они обычно имеют верхний регистр в Oracle; это только lower- или смешанный случай, если они созданы с двойными кавычками вокруг них.

  • 2
    кстати, я нашел общий способ сделать это независимо от базы данных через jdbc .. по ссылке здесь: kodejava.org/examples/163.html
  • 0
    Я также должен был добавить and virtual_column = 'NO' к моему запросу.
88

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

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';
  • 23
    Имейте в виду, что Oracle чувствителен к регистру. Я обычно использую ...WHERE LOWER(Table_Name) = 'mytablename'; ,
  • 2
    @ user565869 Я бы использовал where lower(TABLE_NAME) = lower('WHATEVER') , иначе, когда имя таблицы имеет какой-либо заглавный символ, она также не найдет таблицу
Показать ещё 2 комментария
34

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

desc users

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

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

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

select  COLUMN_NAME  from user_tab_columns
where table_name='test_tbl'; 

  • 1
    USER_TAB_COLUMNS - это фактически столбцы таблиц, принадлежащих пользователю, а не столбцы таблиц, разрешенные пользователю.
  • 1
    это работает хорошо, спасибо
2

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

select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'
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 doc.

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

дело в том, что в toad u нужно написать капитал имен таблиц, например:

select *
FROM all_tab_columns
where table_name like 'IDECLARATION';
0
  1. SELECT * FROM <SCHEMA_NAME.TABLE_NAME> WHERE ROWNUM = 0; → Обратите внимание, что это результат запроса, ResultSet. Это можно экспортировать в другие форматы. И вы можете экспортировать результат запроса в Text формат. Экспорт выглядит, как SELECT * FROM SATURN.SPRIDEN WHERE ROWNUM = 0; ниже, когда я сделал 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> → Примечание. Это вывод скрипта.

0

Вы можете попробовать следующее:

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

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

  • 0
    Это можно сделать из SQL * Plus, но это не запрос
0

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

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

Я нахожу это полезным в 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;
  • 0
    Этот ответ очень трудно прочитать. Пожалуйста, подумайте о переформатировании.
  • 0
    Что если есть несколько таблиц с одинаковыми именами, но разными владельцами?
-1

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

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

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

  • 0
    Возможно, вам следует поискать ответы на вопросы DB2? Я сомневаюсь, что кому-то, кто ищет Oracle, понадобится ответ DB2.
  • 1
    Этот ответ действительно помог мне. Я использую DB2 в режиме Oracle, и он не поддерживает all_tab_cols.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню