Запрос Oracle для получения имен столбцов - PullRequest
105 голосов
/ 05 января 2012

У меня есть запрос 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 голосов
/ 05 января 2012

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

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

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

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; они только в нижнем или смешанном регистре, если созданы с двойными кавычками вокруг них.

91 голосов
/ 18 декабря 2012

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

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';
35 голосов
/ 11 августа 2013

в Oracle вы можете использовать

desc users

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

6 голосов
/ 27 августа 2015

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

select  COLUMN_NAME  from user_tab_columns
where table_name='test_tbl'; 

2 голосов
/ 09 декабря 2015

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

select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'
2 голосов
/ 05 января 2012

Запрос для использования с 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 голосов
/ 02 декабря 2018

Дело в том, что в toad вам нужно написать имя таблицы, например:

select *
FROM all_tab_columns
where table_name like 'IDECLARATION';
0 голосов
/ 06 июня 2018
  1. SELECT * FROM <SCHEMA_NAME.TABLE_NAME> WHERE ROWNUM = 0; -> Обратите внимание, что это Query Result, 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> -> Примечание. Это вывод сценария.

0 голосов
/ 27 февраля 2018

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

опишите 'Имя таблицы'

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

0 голосов
/ 14 октября 2017

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

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 символов, что редко.В большинстве случаев это будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...