oracle-запрос для извлечения информации из словаря данных, включая таблицу первичного ключа и столбец, на который указывает этот внешний ключ
Мне нужно создать запрос в Oracle 10g для словаря данных, который извлекает следующую информацию для всех таблиц в данной схеме:
- Имя таблицы
- Название колонки
- "P", если столбец является первичным ключом
- Если на этот столбец ссылаются во внешнем ключе, имя таблицы + '.' + имя столбца первичного ключа в другой таблице, на которую указывает этот внешний ключ.
- Тип данных столбца
Сейчас я просто пытаюсь заставить это работать для одной таблицы в данной схеме. У меня есть запрос, который извлекает все правильно, кроме пункта 4. Для пункта 4 я возвращаю внешний ключ, на который указывает строка (имя таблицы первичного ключа и столбец в другой таблице) в каждой строке, а не только в строке, которая имеет иностранный ключ.
У меня нет разрешения на запись в любую схему, поэтому я не могу создавать рабочие таблицы или использовать хранимую процедуру. Я работал над этим так долго, что начинаю задаваться вопросом, можно ли извлечь эту информацию в одном запросе.
SELECT DISTINCT
t.table_name,
c.column_name,
(SELECT con.constraint_type
FROM all_constraints con, all_cons_columns cols
WHERE con.constraint_name = cols.constraint_name
AND con.owner = cols.owner
AND t.table_name = cols.table_name
AND c.column_name = cols.column_name
AND con.constraint_type = 'P' -- AND status = 'enabled'
)
AS pk_constraint,
(SELECT (SELECT conc.table_name || '.' || conc.column_name
FROM all_cons_columns conc
WHERE conc.owner = con.owner
AND constraint_name = con.r_constraint_name)
fk_ref
FROM all_constraints con, all_cons_columns col
WHERE con.owner = col.owner
AND con.table_name = t.table_name
AND con.constraint_name = col.constraint_name
AND con.constraint_type = 'R')
AS fk_constraint,
c.data_type,
d.comments
FROM all_tables t, all_tab_columns c, all_col_comments d
WHERE t.table_name = c.table_name
AND t.owner = c.owner
AND t.table_name = d.table_name
AND t.owner = d.owner
AND t.owner = %MY_SCHEMA_NAME%
AND t.table_name = %MY_TABLE_NAME%
ORDER BY t.table_name, c.column_name;
Вот что должно быть возвращено (пример данных - при условии, что CustomerAddress.State содержит код, который ссылается на таблицу State, содержащую список кодов состояний с первичным ключом State.StateCode):
- CustomerAddress AddressID P NULL NUMBER
- КлиентАдрес УлицаАдрес NULL NULL VARCHAR (2)
- CustomerAddress State NULL State.StateCode CHAR
Это то, что на самом деле возвращает мой запрос. Вы можете видеть, что State.StateCode повторяется в каждой строке. Это должно появиться только в последнем ряду.
- CustomerAddress AddressID P State.StateCode NUMBER
- CustomerAddress StreetAddress NULL State.StateCode VARCHAR (2)
- CustomerAddress State NULL State.StateCode CHAR
Спасибо за чтение!
1 ответ
Похоже, что на сайте StackExchange есть ответ, который вы ищете по этой ссылке.
Ответ, основанный на Frosty Code, делает то, что вам нужно, и, немного поэкспериментировав, вы получите желаемые результаты.