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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 129 130 131 132 133 134 135 136 137 ... 238

EXECUTE STATEMENT добавляет гибкости хранимым процедурам и триггерам, но с высоким риском ошибок. Возвращаемые значения жестко проверяются на типы данных, чтобы избежать непредсказуемых исключений преобразования данных. Например, строка '1234' может быть преобразована в целое, a 'abc' вызовет ошибку преобразования. Во время компиляции такая строка не может быть проанализирована и проверена.

Синтаксис:

[FOR] EXECUTE STATEMENT <строка>

[INTO :переменная1 [, :переменная2 [, :переменнаяN ] ] DO

<составной-оператор>];

<составной-оператор> = {оператор блок-операторов}

Конструирование выражения или строковой переменной для создания оператора DSQL в строке аргумента должно быть завершено к моменту выполнения EXECUTE STATEMENT. Выполняемый оператор DSQL в строке аргумента не может содержать никаких заменяемых параметров.

В своей простейшей форме EXECUTE STATEMENT выполняет оператор SQL, запрашивающий операцию, которая не возвращает строк данных, а именно:

* INSERT, UPDATE, DELETE;

* EXECUTE PROCEDURE;

* любой оператор DDL за исключением CREATE/DROP DATABASE. Например:

CREATE PROCEDURE EXEC_PROC (PROC_NAME VARCHAR (31))

AS

DECLARE VARIABLE SQL VARCHAR(1024);

DECLARE VARIABLE . . .

BEGIN

. . .

SQL = 'EXECUTE PROCEDURE ' || PROC_NAME;

EXECUTE STATEMENT SQL;

END ^

Процедура вызывает следующее:

EXECUTE PROCEDURE EXEC_PROC ( ' PROJECT_MEMBERS ' ) ;

Переменные значения в одиночном SELECT

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

CREATE PROCEDURE SOME_PROC

(TABLE_NAME VARCHAR (31), COL_NAME VARCHAR (31))

AS

DECLARE VARIABLE PARAM DATE;

BEGIN

EXECUTE STATEMENT 'SELECT MAX ( ' || COL_NAME || ') FROM ' || TABLE_NAME

INTO : PARAM;

. . .

FOR SELECT . . . . FROM . . . .

WHERE END_DATE = : PARAM

INTO ... DO

. . .

END ^

Переменные значения в многострочном SELECT

Синтаксис EXECUTE STATEMENT также поддерживает выполнение оператора SELECT внутри цикла FOR для возвращения по одной строки за раз в список переменных. Не существует ограничений на используемый оператор SELECT, однако помните, что во время компиляции синтаксический анализатор не может проверить содержимое строки.

CREATE PROCEDURE DYNAMIC_SAMPLE (

TEXT_COL VARCHAR(31),

TABLE_NAME VARCHAR (31))

RETURNS (LINE VARCHAR(32000))

AS

DECLARE VARIABLE ONE_LINE VARCHAR (100);

DECLARE VARIABLE STOP_ME SMALLINT;

BEGIN

LINE = ' ' ;

STOP_ME = 1;

FOR EXECUTE STATEMENT

'SELECT ' || TEXTCOL || ' FROM ' || TABLE_NAME

INTO :ONE_LINE DO

BEGIN

IF (STOP_ME > 320) THEN

EXIT;

IF (ONE_LINE IS NOT NULL) THEN

LINE = LINE || ONE_LINE || ' '

STOP_ME = STOP_ME + 1;

END

SUSPEND;

END ^

Предостережения

Средство EXECUTE STATEMENT предназначено только для очень осторожного использования и должно применяться с учетом всех факторов. Используемые в нем операции медленны и рискованны. Возьмите за правило применять его только в случае невозможности получить нужные результаты другими средствами или (что маловероятно) когда это действительно улучшает выполнение оператора. Будьте в курсе, что есть риск:

* не существует способа проверить синтаксис оператора в строке аргумента;

* не проверяются зависимости или существование защиты для предотвращения удаления или изменения таблиц или столбцов;

* операции выполняются медленно, потому что встроенный оператор должен подготавливаться на сервере каждый раз перед выполнением;

* если хранимая процедура имеет специальные привилегии к некоторым объектам, то динамический оператор, выдаваемый в строке EXECUTE STATEMENT, не наследует их. Используются те привилегии, которые имеет пользователь, выполняющий процедуру.

POST_EVENT

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

Синтаксис оператора:

POST_EVENT имя-события;

Это приводит к тому, что событие имя-события "отправляется" в стек, имя-события может быть любой строкой, содержащей до 78 символов и не требующей предварительного определения на сервере. Помещенные в стек события будут отправлены клиентам, "прослушивающим" события с помощью обработчика извещений (event alerter).

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

Подробности см. в разд. "События" главы 32.

Разработка модулей

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

Добавление комментариев

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

В заголовок и тело модуля PSQL могут быть включены и многострочные, и встроенные комментарии. Синтаксис комментариев подробно обсуждался в главе 14 в разд. "Скрипты схемы".

Чувствительность к регистру и пробелы

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

Весь остальной код не является чувствительным к регистру. Например (предполагая, что не использовались идентификаторы объектов с разделителями), следующие два фрагмента операторов являются эквивалентными:

CREATE PROCEDURE MYPROC...

create procedure myproc...

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

Управление вашим кодом

Учитывая, что языком высокого уровня для программирования на стороне сервера в Firebird является язык SQL и что исходный код представляется серверу в форме "супероператоров" DDL для компиляции в объекты базы данных, не удивительно, что вся поддержка кодов также выполняется с использованием операторов DDL. Эти операторы совместимы с соглашениями по поддержке других объектов в базе данных SQL.

* Переопределению скомпилированных объектов (хранимых процедур и триггеров) служит синтаксис ALTER PROCEDURE | TRIGGER. Для хранимых процедур Firebird также предоставляет синтаксис RECREATE PROCEDURE и (начиная с версии 1.5) CREATE или REPLACE PROCEDURE.

* Операторы DROP PROCEDURE | TRIGGER используются для удаления модулей.

Существует два способа управления процедурами и триггерами: интерактивно вводить операторы с использованием isql или другого инструмента, который может передавать DSQL, или с использованием одного или более выходных файлов, содержащих операторы определения данных, называемых скриптами.

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

Инструменты редактирования

Может быть использован любой текстовый редактор ASCII, который не сохраняет непечатаемые символы за исключением символа перевода строки (ASCII 13), возврата каретки (ASCII 10) и символа табуляции (ASCII 9). Некоторые редакторы имеют средства подсветки ключевых слов SQL: редакторы IDE для Borland Delphi и Kylix, а также некоторые другие инструменты, представленные в приложении 5.

! ! !

СОВЕТ. Утилита командной строки isql может быть использована в качестве редактора при употреблении команды EDIT. Эта команда будет использовать выбранный вами текстовый редактор, если вы установите в вашей системе соответствующие переменные окружения. В POSIX установите переменную окружения VISUAL или EDITOR. В Windows установите EDITOR.

1 ... 129 130 131 132 133 134 135 136 137 ... 238
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри.
Книги, аналогичгные Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри

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