Галерея
7757 8119 8300 8698 8817 9504 9722 9937
Интересные записи
Новое на сайте
Топовые новости

Фиктивные таблицы

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

SQL:2003 Фиктивные таблицы, равно как и сама возможность отбора “из ничего”, не определены в стандарте SQL. Они стали ответом производителей СУБД на потребности пользователей. Oracle предлагает специальную таблицу с названием DUAL для случаев, когда физического объекта (таблицы или представления) для отбора данных не существует. Предположим, что нужно узнать системное время в базе данных Oracle. Для этого существует системная функция с названием SYSDATE. Эта функция отсутствует в стандарте SQL:2003 — она является расширением языка PL/SQL. Так как все запросы должны начинаться с ключевого слова SELECT, мы его укажем, однако в базе данных не хранится запрашиваемая информация — она генерируется динамически по требованию. В подобных ситуациях пригодится таблица DUAL; из нее можно “извлечь” практически все, что угодно. В СУБД DB2 реализована аналогичная концепция — фиктивная таблица SYSDUMMY1, расположенная в системной схеме SYSIBM. Эта таблица имеет один столбец с названием IBMREQD, в единственной строке которого содержится значение Y. В следующем примере продемонстрировано использование этой таблицы для вычисления суммы двух чисел. Сумма этих чисел нигде не хранится, однако, согласно стандарту SQL:2003, она должна быть извлечена. Данная концепция становится особенно важной при использовании функций SQL в процедурных языках (таких как Oracle PL/SQL, IBM SQL PL и Microsoft Transact-SQL).