INFORMATION_SCHEMA и Oracle
Информационная схема (INFORMATION_SCHEMA) является стандартным представлением метаданных в языке SQL. Исторически каждый производитель реляционных СУБД предоставлял системные таблицы, которые содержали мета-информацию - имена таблиц, столбцов, ограничений, типы данных столбцов и т.д. Структура и состав системных таблиц могут меняться в разных версиях продукта, однако поддержка информационной схемы дает возможность менять структуру системных таблиц без изменения способа доступа к метаданным. Другим преимуществом применения INFORMATION_SCHEMA является то, что запросы к метаданным не зависят от используемой СУБД.
Из ведущих производителей, пожалуй, только Oracle не поддерживает INFORMATION_SCHEMA. Справедливости ради следует сказать, что Oracle предоставляет возможность использовать системные представления вместо непосредственного обращения к системным таблицам, что также позволяет безопасно изменять структуру системных таблиц.
Приведем ряд типичных запросов в стандартном варианте и для Oracle.
1. Список таблиц базы данных (текущей)
Стандартное
select table_name from information_schema.tables;
[[ column ]] |
---|
[[ value ]] |
Oracle
select table_name from all_tables where owner='ИМЯ СХЕМЫ';
2. Список столбцов заданной таблицы (например, PC)
Стандартное
select column_name from information_schema.columns where table_name='PC';
[[ column ]] |
---|
[[ value ]] |
Oracle
select column_name from all_tab_columns where table_name='PC';
3. Тип данных и размер заданного символьного столбца таблицы (столбец model таблицы PC)
Стандартное
select column_name, data_type, CHARACTER_MAXIMUM_LENGTH
from information_schema.columns where table_name='PC' and column_name = 'model';
[[ column ]] |
---|
[[ value ]] |
Oracle
select column_name,data_type,data_length from all_tab_columns
where table_name='PC'and column_name='MODEL';
4. Имя ограничения первичного ключа таблицы PC
Стандартное
select table_name,constraint_name from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
where table_name='PC' and CONSTRAINT_TYPE='Primary key';
[[ column ]] |
---|
[[ value ]] |
Oracle
select table_name,constraint_name from all_constraints
where table_name='PC' and constraint_type='P';
5. Список столбцов, составляющих первичный ключ таблицы Utb
Стандартное
select table_name, column_name
from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE where table_name='utb'
and constraint_name=(select constraint_name from INFORMATION_SCHEMA.table_constraints
where table_name='utb' and CONSTRAINT_TYPE='Primary key');
[[ column ]] |
---|
[[ value ]] |
Здесь мы в основном запросе получаем столбцы, участвующие в ограничениях, и выбираем те из них, у которых имя ограничения совпадает с именем ограничения первичного ключа для той же таблицы. В принципе, условие table_name=‘utb’ основного запроса является избыточным с точки зрения получения правильного ответа, поскольку имя ограничения является уникальным для всей базы. Однако ранняя фильтрация существенно ускоряет выполнение запроса.
Оракл
select table_name, column_name from all_ind_columns where table_name='UTB'
and index_name=(select constraint_name from all_constraints
where table_name='UTB' and constraint_type='P');