INFORMATION_SCHEMA и Oracle

Информационная схема (INFORMATION_SCHEMA) является стандартным представлением метаданных в языке SQL. Исторически каждый производитель реляционных СУБД предоставлял системные таблицы, которые содержали мета-информацию - имена таблиц, столбцов, ограничений, типы данных столбцов и т.д. Структура и состав системных таблиц могут меняться в разных версиях продукта, однако поддержка информационной схемы дает возможность менять структуру системных таблиц без изменения способа доступа к метаданным. Другим преимуществом применения INFORMATION_SCHEMA является то, что запросы к метаданным не зависят от используемой СУБД.

Из ведущих производителей, пожалуй, только Oracle не поддерживает INFORMATION_SCHEMA. Справедливости ради следует сказать, что Oracle предоставляет возможность использовать системные представления вместо непосредственного обращения к системным таблицам, что также позволяет безопасно изменять структуру системных таблиц.

Приведем ряд типичных запросов в стандартном варианте и для Oracle.

1. Список таблиц базы данных (текущей)

Стандартное

select table_name from information_schema.tables;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]

Oracle

select table_name from all_tables where owner='ИМЯ СХЕМЫ';

2. Список столбцов заданной таблицы (например, PC)

Стандартное

select column_name from information_schema.columns where table_name='PC';
mssql
🚫
[[ error ]]
[[ 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';
mssql
🚫
[[ error ]]
[[ 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';
mssql
🚫
[[ error ]]
[[ 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');
mssql
🚫
[[ error ]]
[[ 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');