Читать интересную книгу Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 94 95 96 97 98 99 100 101 102 ... 238

DECLARE EXTERNAL FUNCTION sright

VARCHAR(100) BY DESCRIPTOR, SMALLINT,

VARCHAR(100) RETURNS PARAMETER 3

ENTRY POINT 'right' MODULE_NAME 'fbudf';

Идентификатор (имя) функции

При объявлении внешней функции для базы данных вы не ограничены использованием только имен, появляющихся в скрипте. Имя функции должно быть уникальным среди имен всех функций, объявленных в базе данных. Библиотеки общего использования обычно соответствуют соглашению о поставляемых объявлениях, по которому эти имена "не наступают на ноги" идентификаторам, обычно используемым в другой библиотеке, поэтому вы можете увидеть некоторые странности в именах в этих скриптах.

Иногда вам может понадобиться объявить одну и ту же функцию для вашей базы данных более одного раза. Пока вы используете различные имена в EXTERNAL FUNCTION, вы можете объявлять функцию, имеющую те же ENTRY_POINT и MODULE_NAME, столько раз, сколько вам нужно.

! ! !

ВНИМАНИЕ! Никогда не изменяйте аргумент ENTRY_POINT. Аргумент MODULE_NAME не должен изменяться за исключением случая, когда необходимо использовать полный путь к библиотеке (см. разд. "Пути в объявлениях функций").

. ! .

Размеры строковых аргументов

Скрипты содержат объявления размеров по умолчанию для внешних функций, которые принимают аргументы в виде строковых переменных. По причинам безопасности размеры по умолчанию сохраняются малыми, чтобы избежать риска случайного или злонамеренного переполнения. Если строковые функции получают входные данные или возвращают результаты, которые больше объявленного размера, то вызывается исключение.

Если вам нужен аргумент для строковой функции, имеющий размер больший, чем значение по умолчанию, объявите аргумент в соответствии с вашими требованиями, убедитесь, что входные и выходные данные согласованы друг с другом и ни один аргумент не превышает максимального для VARCHAR значения 32 765 байт - заметьте: байтов, а не символов.

В следующем примере функция, описанная в скрипте fbudf.sql как sright, объявляется с именем srirgt2000, а размер параметров изменяется до 200 байт:

DECLARE EXTERNAL FUNCTION sright200

VARCHAR(200) BY DESCRIPTOR, SMALLINT,

VARCHAR (200) RETURNS PARAMETER 3

ENTRY_POINT 'right' MODULE_NAME ' fbudf' ;

Пути в объявлениях функций

Для любой платформы в ссылке на модуль может отсутствовать путь или расширение файла. Это желательно, если вы собираетесь перемещать базу данных, содержащую объявления функций, на множество операционных систем. Конфигурация по умолчанию для Firebird 1.5 позволяет это сделать.

В версии 1.0.x нужно будет Сконфигурировать параметр external_function_directory в iscconfig/ibconfig для каждой платформы, на которой эти функции будут использоваться, поскольку эта версия не содержит "пути по умолчанию" для модулей функций. По умолчанию должен работать каталог /UDF, однако практика показывает, что это ненадежно без явно заданной конфигурации.

Для Firebird 1.5 и выше существуют другие режимы конфигурации (UDFAccess) для размещения библиотек функций (см. главу 36), включая RESTRICT, который позволяет задать для них один или более каталогов. Если вы используете RESTRICT, то в объявление нужно включить полный путь к модулю и расширение файла. В этом случае база данных не будет переносима на другую операционную систему, пока вы не удалите из базы данных функции и их зависимости.

Следующий пример показывает объявление функции с указанием полного пути:

DECLARE EXTERNAL FUNCTION lpad

CSTRING(80) , INTEGER, CSTRING(1)

RETURNS CSTRING(80) FREE_IT

ENTRY_POINT ' IB_UDF_lpad' MODULE_NAME '/opt/extlibs/ib_udf .so' ;

Список внешних функций

Приложение 1 содержит детальное описание с примерами внешних функций из библиотек ib_udf и fbudf из каталога /UDF каталога инсталляции Firebird, а также многие функции из FreeUDFLib.

Пора дальше

Важность использования логики выражений для трансформации абстрактных данных в осмысленную информацию аналогична важности использования средств SQL по слиянию данных из множества таблиц в один набор связанных данных. В следующей главе мы рассмотрим существующие в DML способы выполнения таких многотабличных операций. Эта глава заканчивается специальной темой оптимизации запросов Firebird и использованием планов запросов (предложение PLAN) В запросах SELECT.

ГЛАВА 22. Запросы к множеству таблиц.

Динамический SQL Firebird поддерживает три варианта запросов к множеству таблиц с помощью одного оператора SQL: соединения (joins), подзапросы (subqueries) и объединения (unions). Результат соединений, столбцов подзапроса и объединений является по своей природе набором данных только для чтения.

Firebird не поддерживает многотабличные запросы, которые находятся в нескольких базах данных. Тем не менее возможен запрос к нескольким таблицам одновременно из нескольких баз данных внутри одной транзакции, имеющей полное двухфазное завершение (two-phase commit- 2РС). Клиентские приложения могут сопоставлять данные и выполнять отдельные операторы манипулирования данными в пределах базы данных. Мультибазовые транзакции обсуждаются в части VI.

В этой главе мы рассмотрим три метода динамического поиска данных в нескольких таблицах[77] в контексте одного оператора и одной базы данных: соединения, подзапросы и объединения.

Данная глава завершается темой оптимизации, где рассматриваются планы выполнения запросов, и как оптимизатор Firebird выбирает и использует индексы для создания этих планов. Понимание того, как оптимизатор "думает", может быть полезным при проектировании хорошо сформированных индексов и создании операторов запросов.

Виды многотабличных запросов

Три метода поиска данных во множестве таблиц довольно сильно отличаются друг от друга и, как правило, выполняют различные виды поисковых задач. Поскольку соединения и подзапросы используют слияние потоков данных из строк различных таблиц, их роли частично совпадают при некоторых условиях. Коррелированный подзапрос, который может создавать относительные связи между колонками главной таблицы, иногда может содержать спецификации для получения того же результата, что и соединение, без использования самого соединения. С другой стороны, объединения запросов не используют слияние потоков; напротив, они "собирают" строки. Их роль никогда не совпадает с ролью запросов соединения или подзапросов.

Соединения, подзапросы и объединения не являются взаимоисключающими, несмотря на то, что результат объединения не может быть соединен один с другим или с другими результатами. Спецификации соединения и объединения могут включать подзапросы, и некоторые подзапросы могут содержать соединения.

Соединения

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

Операции соединения создают наборы данных только для чтения, для которых не могут применяться операции INSERT, UPDATE или DELETE. Интерфейс некоторых приложений содержит средства, позволяющие сделать поведение соединенных наборов данных таким, как если бы они были изменяемыми.

Подзапросы

Подзапросом является оператор SELECT, включенный в другой запрос. Внедренный запрос, встроенный запрос, вложенный запрос являются синонимами для подзапроса. Подзапросы используются с различными условиями для чтения данных из других таблиц в основной (внешний для подзапроса) запрос. Правила составления подзапросов изменяются в соответствии с целью подзапроса. Прочитанные данные всегда являются данными только для чтения.

Запросы UNION

Запросы объединения дают возможность выбрать строки соответствующих форматов из различных наборов данных в объединенный набор данных, который приложения могут использовать так, как если бы он был одной таблицей только для чтения. Подмножества, найденные в таблицах, не обязательно должны быть связаны друг с другом - просто они должны соответствовать друг другу структурно.

Соединения

Соединение используется в операторах SELECT для генерации ненормализованных наборов, содержащих столбцы из нескольких таблиц, которые хранят связанные данные. Множества столбцов, выбранных из каждой таблицы, называются потоками. Процесс соединения объединяет выбранные столбцы в единый выходной набор данных. Простейшим случаем является соединение двух таблиц, которые связаны соответствием элементов ключа, встречающихся в обеих таблицах.

Для создания связи ключевые столбцы выбираются на основании того, что они реализуют недвусмысленное отношение - т. е. ключ в левой таблице соединения будет отыскивать только те строки из правой таблицы, которые соответствуют отношению, и он будет отыскивать все такие строки. Обычно связь осуществляется между уникальным ключом левой таблицы (первичный или любой другой уникальный ключ) и формальным или подразумеваемым внешним ключом правой таблицы.

1 ... 94 95 96 97 98 99 100 101 102 ... 238
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри.
Книги, аналогичгные Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри

Оставить комментарий