У меня есть запрос 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) у меня есть только имя табличного пространства, что эквивалентно имени схемы (логически?)
Эквивалент 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- или смешанный случай, если они созданы с двойными кавычками вокруг них.
Следующий запрос работал у меня в базе данных Oracle.
select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';
...WHERE LOWER(Table_Name) = 'mytablename';
,
where lower(TABLE_NAME) = lower('WHATEVER')
, иначе, когда имя таблицы имеет какой-либо заглавный символ, она также не найдет таблицу
в оракуле вы можете использовать
desc users
для отображения всех столбцов, содержащихся в таблице пользователей
Вы можете попробовать следующее: (Он работает на 11g и возвращает все имя столбца из таблицы, здесь test_tbl - это имя таблицы, а user_tab_columns - столбцы, разрешенные пользователем).
select COLUMN_NAME from user_tab_columns
where table_name='test_tbl';
USER_TAB_COLUMNS
- это фактически столбцы таблиц, принадлежащих пользователю, а не столбцы таблиц, разрешенные пользователю.
Единственным способом, которым я смог получить имена столбцов, был следующий запрос:
select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'
Запрос для использования с 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.
TABLE_NAME='"+_db+".users'
потерпит неудачу; вам нужно разделить владельца / схему и имя таблицы в ALL_TAB_COLUMNS
дело в том, что в toad u нужно написать капитал имен таблиц, например:
select *
FROM all_tab_columns
where table_name like 'IDECLARATION';
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 "
DESCRIBE <TABLE_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
, которые являются редкими. В большинстве случаев это будет работать.
Я нахожу это полезным в 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;
Вы можете использовать приведенный ниже запрос, чтобы получить список имен таблиц, который использует определенный столбец в DB2:
SELECT TBNAME
FROM SYSIBM.SYSCOLUMNS
WHERE NAME LIKE '%COLUMN_NAME';
Примечание. Здесь замените COLUMN_NAME
на имя столбца, которое вы ищете.
and virtual_column = 'NO'
к моему запросу.