Запит 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для стовпців таблиць 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.

EDIT: великі назви таблиць і стовпців, оскільки вони зазвичай є великими літерами в 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');працює так само добре.
користувач3553260

Використання lower(TABLE_NAME)або upper(TABLE_NAME)вимагає від Oracle зробити сканування ALL_TAB_COLUMNSтаблиці, щоб отримати всі значення, TABLE_NAMEперш ніж він зможе порівняти їх із наданими UPPER('MyTableName'). При швидкому тестуванні це зробило продуктивність непридатною для моєї мети, тому я буду дотримуватися порівняння з урахуванням регістру.
Кріс Магнусон

40

в oracle ви можете використовувати

desc users

для відображення всіх стовпців, що містяться в таблиці користувачів


6
... тому що, хоча це відповідає на "як отримати список усіх стовпців таблиці", він не відповідає на запитання, яке було задано: 1) це не запит, 2) він не обмежує / фільтруйте повернуті стовпці, 3) чи повертає набір результатів?
Егрик

6
Відсутність анкет не дає desc usersпоганої відповіді на деякі запитання, але це не є гарною відповіддю на це .
Егрик

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

7

Ви можете спробувати це: (Він працює на 11 г, і він повертає все ім’я стовпця з таблиці, тут test_tbl - це ім'я таблиці, а user_tab_column - стовпці дозволених користувачем таблиць)

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 в основному використовуються для логічних внутрішніх технічних цілей, які повинні турбувати DBA. Для отримання додаткової інформації щодо табличних просторів див. Док . Oracle .


TABLE_NAME='"+_db+".users'провалиться; вам потрібно відокремити власника / схему та ім’я таблиці вALL_TAB_COLUMNS
Девід Фабер

2

Єдиний спосіб, коли мені вдалося отримати імена стовпців, було використовувати наступний запит:

select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'

2

справа в тому, що у жабі u треба записати назву таблиці з великої літери, наприклад:

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

Що робити, якщо є кілька таблиць з однаковою назвою, але різні власники?
Девід Фабер

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.