Развитие идей и приложений реляционной СУБД System R


Трансляция запросов и поддержка времени выполнения - часть 11


Как отмечается в [26], в секциях этого рода допускается и выполнение операции Describecall, но при этом всегда возвращается один и тот же результат, по которому можно определить, что секция соответствует не запросу на выборку. Выполнение такого проверочного действия требуется, если секция образовалась динамически на стадии выполнения путем вовлечения оператора PREPARE, поскольку тогда в динамике неизвестно, какому типу запроса она соответствует.

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

В секциях модуля доступа, полученных при прекомпиляции или динамической компиляции предложений SQL типа SELECT (т.е. запросов на выборку), доступны пять операций - Opencall, Fetchcall, Closecall, Describecall и Setupcall. Если секция образована в период прекомпиляции, то используются главным образом три первые операции. При этом первой операцией по отношению к одной секции должна быть операция Opencall. Концептуально выполнение этой операции можно рассматривать как формирование временного отношения, содержащего результат запроса. Достаточно часто это и на самом деле так, например, в случае, когда в запросе указана необходимость сортировки результатов. В более простых случаях можно избежать реального построения такого временного отношения и генерировать кортежи результата по мере потребности.

В любом случае после выполнения вызова Opencall, соответствующего операции SQL OPEN <идентификатор курсора>, секция приводится в состояние, позволяющее получать очередной кортеж результата в памяти программы с помощью вызова операции Fetchcall.


Начало  Назад  Вперед