Запросов 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) у меня есть только табличное пространство имя, так что это эквивалентно имени схемы (логически?)
11 ответов
эквивалент Oracle для information_schema.COLUMNS
is 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.
Я думаю, что пространство не имеет ничего общего со схемой. AFAIK табличные пространства в основном используются для логических внутренних технических целей, которые должны беспокоить 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
символы, которые редки. В большинстве случаев , это будет работа.
-
SELECT * FROM <SCHEMA_NAME.TABLE_NAME> WHERE ROWNUM = 0;
--> обратите внимание, что это результат запроса, набор результатов. Это можно экспортировать в другие форматы. И, вы можете экспортировать Результат Запроса to . Экспорт выглядит как ниже, когда я сделал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"
DESCRIBE <TABLE_NAME>
--> Примечание: это вывод скрипта.
Вы можете использовать приведенный ниже запрос, чтобы получить список имен таблиц, которые использует конкретный столбец в DB2:
SELECT TBNAME
FROM SYSIBM.SYSCOLUMNS
WHERE NAME LIKE '%COLUMN_NAME';
Примечание : здесь заменить COLUMN_NAME
С именем столбца, который вы ищете.