Из всех SQL-операторов в программах PL/SQL можно применять лишь операторы DML и операторы управления транзакциями. Операторы DDL использовать нельзя. Оператор EXPLAIN PLAN (объяснить план) - хотя он и относится к категории — применять также не разрешается. Чтобы пояснить смысл этих ограничений, рассмотрим принципы создания программ PL/SQL.
В любом языке программирования привязка переменных может быть либо ранней, либо поздней. Привязка (binding) переменной — это процесс указания области памяти, соответствующей идентификатору программы. В PL/SQL в процесс привязки входит также проверка базы данных на наличие полномочий, позволяющих обращаться к объектам схем. В том языке, где используется ранняя привязка (early binding), этот процесс осуществляется на этапе компиляции программы, а в языке, где применяется поздняя привязка (late binding), она откладывается до этапа выполнения программы. Ранняя привязка означает, что компиляция программы будет занимать большее время (так как при этом нужно привязывать переменные), однако выполняться такая программа будет быстрее, потому что привязка уже завершена. Поздняя привязка сокращает время компиляции, но увеличивает время выполнения программы.
При разработке PL/SQL было принято решение об использовании ранней привязки, чтобы к моменту выполнения блока объекты базы данных были уже проверены и чтобы блок мог быть выполнен максимально быстро. Это вполне оправданно, поскольку блоки PL/SQL можно хранить в базе данных как процедуры, функции, модули и триггеры. Такие объекты хранятся в скомпилированном виде, т.е. при необходимости их можно загрузить из базы данных и выполнить (см. главы 9 —' 11). Именно поэтому нельзя использовать операторы DDL. Оператор DDL модифицирует объект базы данных, следовательно, полномочия на объект должны быть подтверждены вновь. Процесс подтверждения полномочий требует привязки идентификаторов, а это уже было сделано во время компиляции.
Для иллюстрации вышесказанного рассмотрим гипотетический блок PL/SQL:
Чтобы скомпилировать этот блок, нужно привязать идентификатор temp_table. В процессе привязки будет проверяться, существует ли указанная таблица. Но пока блок не выполнен, таблица не существует. В результате данный блок не может быть скомпилирован, ни тем более выполнен.
Операторы DML и операторы управления транзакциями — это SQL-операторы, с помощью которых нельзя модифицировать объекты схем или полномочия на объекты схем, поэтому в PL/SQL можно использовать только эти SQL-операторы.
< Предыдущая | Следующая > |
---|