При первом создании экземпляра модуля его р-код считывается с диска и помещается в разделяемый пул. Однако состояние модуля на этапе выполнения (runtime state), т.е. сведения о модульных переменных и курсорах, фиксируется в памяти сеанса в пользовательской глобальной области, что
гарантирует наличие собственной копии состояния модуля у каждого сеанса. Оно инициализируется при создании экземпляра модуля (в это время выполняется код инициализации) и не сбрасывается до окончания сеанса.
Даже если сам модуль удаляется со временем из разделяемого пула, состояние модуля сохраняется. Как было показано в главе 9, переменные, объявляемые в заголовке модуля, имеют глобальную область действия. Они видимы
любому блоку PL/SQL, имеющему привилегию EXECUTE на модуль. Поскольку состояние на этапе выполнения будет сохраняться в течение всего сеанса работы с базой данных, то переменные в заголовке пакета могут использоваться как глобальные переменные. Рассмотрим пример:

Процедура PersistPkg. ReadStudents выбирает информацию из курсора StudentsCursor. Он объявлен на уровне модуля (а не внутри ReadStudents), поэтому останется вне вызова ReadStudents. Вызовем PersistPkg. ReadStudents в следующем блоке:
Результаты троекратного выполнения этого блока представлены на рис. 10.11. При каждом вызове возвращаются разные данные, поскольку курсор остается открытым между вызовами.
| < Предыдущая | Следующая > |
|---|


