СТАТЬЯ
09.04.01

предыдущая часть | содержание | следующая часть

ГЛАВА 4

ОБРАБОТКА ПРЕДЛОЖЕНИЙ SQL И PL/SQL

Эта глава описывает, как ORACLE обрабатывает команды структурного языка запросов (SQL). Темы этой главы включают рассмотрение следующих вопросов:

  • этапы исполнения каждого типа предложений SQL
  • рекомендации по управлению транзакциями
  • использование курсоров в предложениях SQL
  • явное блокирование данных
  • использование обработки массивов для улучшения производительности
  • использование PL/SQL для улучшения производительности

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

    Исполнение предложений SQL

    Рис.4-1 иллюстрирует шаги, обычно используемые для обработки и исполнения предложения SQL. В некоторых случаях порядок выполнения этих шагов может несколько отличаться от показанного. Например, фаза DEFINE может происходить непосредственно перед фазой FETCH, в зависимости от того, как написан ваш код. Рис.4-1

    Шаги обработки предложения SQL

     

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

    Обработка предложений DML

    Эта секция дает упрощенное представление о том, что происходит во время исполнения предложения SQL. В качестве примера рассматривается предложение DML (UPDATE). Запросы (предложения SELECT) требуют дополнительных шагов, как показано на рис.4-1; для дополнительной информации обратитесь к секции "Обработка запросов".

    Допустим, вы используете программу на Pro*C, чтобы увеличить зарплату для всех сотрудников отдела. Предположим также, что эта программа соединилась с ORACLE, и вы подключены со всеми необходимыми привилегиями для обновления таблицы EMP. Вы можете встроить в свою программу следующее предложение SQL:

     EXEC SQL UPDATE emp SET sal = 1.10 * sal 
     WHERE deptnp = :dept_number; 
    

    DEPT_NUMBER - это программная переменная, содержащая значение для номера отдела. При исполнении этого предложения SQL используется значение переменной DEPT_NUMBER, поставляемое программой на языке C.

    Ниже детально описано, что происходит на фазах обработки предложения DML. Те же фазы необходимы для обработки каждого типа предложений SQL.

    Этап 1: Создание курсора

    Курсор создается через вызов программного интерфейса. Курсор создается независимо от конкретного предложения SQL; он создается в предвидении любого предложения SQL. В большинстве предложений создание курсора осуществляется автоматически. Однако в программах прекомпиляторов создание курсоров может осуществляться как неявно, так и явно, путем объявления курсора. Обратитесь к секции "Использование курсоров" на странице 4-11 для дополнительной информации о курсорах. Обработка предложений SQL и PL/SQL 4-3

    Этап 2: Разбор предложения

    Во время разбора (PARSE) предложение SQL передается из пользовательского процесса в ORACLE, и разобранное представление этого предложения загружается в разделяемую область SQL. На этой фазе обработки предложения SQL может быть встречено много ошибок. Разбор - это процесс, который выполняет следующие действия: * трансляцию предложения SQL и проверку его на законность

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

    Разбор предложения SQL выполняется только в том случае, если в разделяемом пуле не существует разделяемой области SQL, содержащей идентичное предложение SQL. В таком случае распределяется новая разделяемая область SQL, и предложение разбирается. Для дополнительной информации о разделяемых областях SQL обратитесь к секции "Разделяемый SQL" на странице 4-10.

    На фазе разбора выполняются те действия, которые необходимо выполнить лишь один раз, независимо от того, сколько раз будет исполняться это предложение. ORACLE транслирует каждое предложение SQL только один раз, а при последующих ссылках на это предложение повторяет исполнение ранее разобранного предложения.

    Хотя при разборе предложения SQL выполняется проверка на ошибки, при этом идентифицируются лишь те ошибки, которые могут быть обнаружены ДО ИСПОЛНЕНИЯ ПРЕДЛОЖЕНИЯ. Таким образом, не все ошибки могут быть определены при разборе. Например, ошибки преобразования данных, ошибки в данных (такие как попытки вставить повторяющиеся значения в первичный ключ), захваты, все это такие ошибки или ситуации, которые могут быть встречены и распознаны лишь на фазе исполнения.
     
      Обработка запросов

    Запросы отличаются от других типов предложений SQL тем, что они возвращают данные как результат своего успешного исполнения. В то время как другие предложения возвращают просто признак успеха или неуспеха, запрос может вернуть одну строку или тысячи строк данных. Результаты запроса ВСЕГДА ИМЕЮТ ТАБЛИЧНУЮ ФОРМУ, и строки этого результата ИЗВЛЕКАЮТСЯ (FETCH), либо по строке за раз, либо группами.

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

    INSERT INTO таблица SELECT ...   
    UPDATE таблица SET x = y WHERE ...   
    DELETE FROM таблица WHERE ...    
    CREATE таблица AS SELECT ...       

    В частности, запросы обладают следующими особенностями:

  • требуют СОГЛАСОВАННОСТИ ПО ЧТЕНИЮ
  • могут использовать временные сегменты для промежуточных данных
  • могут требовать фаз описания (DESCRIBE), определения (DEFINE) и извлечения (FETCH) при обработке предложения

    Этап 3: Описание результатов

    Фаза описания (DESCRIBE) необходима только тогда, когда характеристики результатов запроса неизвестны, например, если запрос вводится интерактивно пользователем.

    В этом случае фаза описания используется для определения характеристик (типов данных, длин и имен) результатов запроса.

    Этап 4: Определение вывода

    На фазе определения (DEFINE) для запросов вы специфицируете адреса, размеры и типы данных переменных, которые принимают каждое извлекаемое значение. ORACLE выполняет преобразование типов данных, если необходимо.

    Этап 5: Связывание переменных

    К этому моменту ORACLE уже знает смысл предложения SQL, но еще не имеет достаточно информации для исполнения этого предложения. ORACLE нуждается в значениях всех переменных, участвующих в предложении; в нашем примере, ORACLE необходимо знать значение переменной DEPT_NUMBER. Этот процесс называется СВЯЗЫВАНИЕМ ПЕРЕМЕННЫХ (BIND).

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

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

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

  • Programmer's Guide to the ORACLE Precompilers ("Динамический SQL, метод 4"), если вы используете прекомпилятор ORACLE
  • Programmer's Guide to the ORACLE Call Interfaces (OCIs), если вы используете интерфейсы вызовов ORACLE (OCI)

    Этап 6: Исполнение предложения

    К этому моменту ORACLE имеет всю необходимую информацию и ресурсы, поэтому он исполняет предложение. Если это запрос или предложение INSERT, то никаких строк блокировать не требуется, потому что никакие данные не изменяются. Однако, если это предложение UPDATE или DELETE, то все строки, затрагиваемые данным предложением, блокируются от других пользователей базы данных до тех пор, пока не будет выдано очередное предложение COMMIT, ROLLBACK или SAVEPOINT в данной транзакции. Это гарантирует целостность данных.

    Для некоторых предложений вы можете специфицировать число исполнений. Это называется ОБРАБОТКОЙ МАССИВА. При заданном числе исполнений n, адреса входных (BIND) и выходных (DEFINE) переменных считаются адресами массивов размера n. Для дополнительных деталей обратитесь к секции "Использование обработки массива" на странице 4-20.

    Этап 7: Извлечение строк результата запроса

    На фазе извлечения (FETCH) строки выбираются и сортируются (если это запрошено запросом), и каждая очередная операция извлекает очередную строку результата, пока не будут извлечены все строки. --

    Обработка предложений DDL

    Исполнение предложений DDL отличается от исполнения предложений DML и запросов, потому что успешное выполнение предложения DDL требует операций записи в словарь данных. Для таких предложений определена лишь фаза разбора, которая включает в себя собственно разбор, просмотр словаря данных и исполнение.

    Такие предложения SQL, как предложения управления транзакциями, управления сессией и управления системой, обрабатываются за две фазы: разбор и исполнение. При повторном выполнении их выполняется лишь фаза исполнения.

      предыдущая часть | содержание | следующая часть

    Дополнительную информацию Вы можете получить в компании Interface Ltd.

    Обсудить на форуме Oracle
    Отправить ссылку на страницу по e-mail


    Interface Ltd.

    Ваши замечания и предложения отправляйте автору
    По техническим вопросам обращайтесь к вебмастеру
    Документ опубликован: 09.04.01