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

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

Ответ 1

Эквивалент 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

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

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';

Ответ 3

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

desc users

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

Ответ 4

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

select  COLUMN_NAME  from user_tab_columns
where table_name='test_tbl'; 

Ответ 5

Запрос для использования с 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.

Ответ 6

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

select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'

Ответ 7

Я нахожу это полезным в 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;

Ответ 8

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

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

Ответ 9

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

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

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

Ответ 10

  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> → Примечание. Это вывод скрипта.

Ответ 11

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

select *
FROM all_tab_columns
where table_name like 'IDECLARATION';

Ответ 12

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

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

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