Введение в стандарты языка баз данных SQL




Прямой вызов операторов SQL - часть 3


(**) если S является прямым оператором, определяемым в реализации, то в реализации же определяется, инициирует ли S транзакцию; если инициирует, то инициируется SQL-транзакция.

(***) если оператор S инициировал транзакцию, то пусть T обозначает эту транзакцию; тогда:

(****) T ассоциируется с данным вызовом и со всеми последующими вызовами прямых операторов SQL и процедур, производимых данным SQL-агентом, до тех пор, пока этот агент не завершит T;

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

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

(*******) T ассоциируется с текущей SQL-сессией;

(iv) область диагностики очищается;

(v) S выполняется.

  • Если в одной транзакции происходит вызов прямого оператора манипулирования данными и оператора манипулирования схемой и это не допускается реализацией, возбуждается исключительное условие.
  • Если выполнение S завершилось успешно, то вырабатывается условие завершения "успешное выполнение", либо "предупреждение", либо "нет данных".
  • Если выполнение S завершилось неуспешно, то все изменения, произведенные S над данными или над схемой, ликвидируются, и возбуждается исключительное условие.
  • Диагностическая информация по поводу выполнения S помещается в область диагностики; способ доступа к диагностической информации определяется в реализации, но в любом случае содержимое области диагностики не меняется.
  • Как видно из синтаксических правил, определяющих набор прямых операторов SQL, в состав этого набора входит специальный оператор выборки, не употребляемый в других контекстах и потому не рассмотренный нами ранее. Синтаксис этого оператора следующий:

    <direct select statement: multiple rows> ::= <query expression> [ <order by clause> ]

    Пояснения:

  • Как видно, синтаксис этого оператора очень напоминает синтаксис спецификации курсора: отсутствует только раздел изменяемости (updatabilityclause). Однако, поскольку это прямой оператор, то в его выражении запроса и разделе сортировки не должны содержаться спецификации значений, отличные от литералов, CURRENT_USER, SESSION_USER и SYSTEM_USER.
  • Пусть Q обозначает результат вычисления выражения запроса.
  • Если Q пусто, то вырабатывается условие завершения оператора "нет данных".
  • Если оператор не содержит раздела сортировки, то порядок строк в Q зависит от реализации; иначе порядок строк устанавливается в соответствии с параметрами раздела сортировки.
  • Если Q непусто, то возвращается оператором, причем используемый способ возврата определяется в реализации.



  • Содержание  Назад  Вперед