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

1048   11  

11 ответов:

эквивалент 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-инъекций.

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

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

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';

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

desc users

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

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

select  COLUMN_NAME  from user_tab_columns
where table_name='test_tbl'; 

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

Я думаю, что пространство не имеет ничего общего со схемой. ЕМНИП табличные пространства в основном используются для логических внутренних технических целей, которые должны беспокоить DBAs. Дополнительные сведения о табличных пространствах см. В разделе Oracle doc.

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

select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'

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

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

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

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

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

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

  1. SELECT * FROM <SCHEMA_NAME.TABLE_NAME> 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> --> Примечание: это вывод скрипта.

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

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

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

Comments

    Ничего не найдено.