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

       

Одиночные операторы


Основной набор одиночных операторов манипулирования данными и смысл этих операторов в SQL/92 не изменился (или незначительно изменился) по сравнению с SQL/89.

Одиночный оператор выборки в SQL/92 имеет следующий синтаксис:

<select statement: single row> ::= SELECT [ <set quantifier> ] <select list> INTO <select target list> <table expression> <select target list> ::= <target specification> [ { <comma> <target specification> }... ]

Смысл этого оператора, если не вдаваться в формализмы стандарта, ничем не отличается от смысла оператора одиночной выборки SQL/89: табличное выражение должно вырабатывать таблицу, состоящую ровно из одной строки, причем число столбцов в этой таблице должно совпадать с числом элементов в списке целей выборки (selecttargetlist).

Оператор поискового удаления строк имеет точно такой же синтаксис, что и в SQL/89:

<delete statement: searched> ::= DELETE FROM <table name> [ WHERE <search condition> ]

Как обычно, основные расширения касаются более мощных возможностей спецификации условия поиска. Кроме того:

  1. Если текущая транзакция выполняется в режиме только чтения, и таблица, из которой удаляются строки, не является временной, возбуждается исключительное условие.
  2. Пометка строк для удаления производится следующим образом:

      (a) если условие поиска не специфицировано, то все строки таблицы помечаются для удаления;

      (b) заданное условие поиска применяется для каждой строки указанной таблицы, и каждая строка, для которой условие поиска вычисляется в true, помечается для удаления.

  3. Как и в случае позиционных операторов обновления, если для некоторой строки обнаруживается, что она уже помечена для обновления (удаления или модификации) другим оператором (позиционным или поисковым), то в условии завершения оператора поискового удаления возвращается предупреждение.
  4. Все строки, помеченные для удаления, реально удаляются в конце оператора до проверки какого-либо ограничения целостности.
  5. Если не удалена ни одна строка, вырабатывается условие завершения "нет данных".


Оператор поисковой модификации обладает почти таким же синтаксисом, что и соответствующий оператор в SQL/89, если не считать некоторых расширений раздела SET (для полноты мы повторим здесь синтаксическое определение конструкции <setclauselist>):

<update statement: searched> ::= UPDATE <table name> SET <set clause list> [ WHERE <search condition> ] <set clause list> ::= <set clause> [ { <comma> <set clause> }... ] <set clause> ::= <object column> <equals operator> <update source> <update source> ::= <value expression> | <null specification> | DEFAULT <object column> ::= <column name>



И в этом случае основные расширения по сравнению с SQL/89 относятся к более мощным возможностям определения условия поиска. Другие расширения и уточнения затрагивают следующее:


  1. Если текущая транзакция выполняется в режиме только чтения и таблица, строки которой модифицируются, не является временной, то возбуждается исключительное условие.
  2. Пометка строк для модификации производится следующим образом:


      (a) если условие поиска не специфицировано, то все строки таблицы помечаются для модификации;

      (b) заданное условие поиска применяется для каждой строки указанной таблицы, и каждая строка, для которой условие поиска вычисляется в true, помечается для модификации.



  3. Как и в случае позиционных операторов обновления, если для некоторой строки обнаруживается, что она уже помечена для обновления (удаления или модификации) другим оператором (позиционным или поисковым), то в условии завершения оператора поисковой модификации возвращается предупреждение.
  4. Если набор объектных строк пуст, вырабатывается условие завершения "нет данных".


Синтаксис оператора вставки строк в SQL/92 на вид довольно значительно отличается от синтаксиса соответствующего оператора SQL/89, но это произошло главным образом за счет расширения конструкции выражения запроса:

<insert statement> ::= INSERT INTO <table name> <insert columns and source> <insert columns and source> ::= [ <left paren> <insert column list> <right paren> ] <query expression> | DEFAULT VALUES <insert column list> ::= <column name list>



Пояснения относительно расширений и уточнений:


  1. Если в разделе вставляемых столбцов и источников данных указано DEFAULTVALUES, то это эквивалентно заданию выражения запроса в форме VALUES(DEFAULT, . . .), где число элементов "DEFAULT" равно числу столбцов в таблице T, в которую заносится строка.
  2. Столбец, указанный в списке вставляемых столбцов, называется объектным.
  3. Если текущая транзакция выполняется в режиме только чтения и T не является временной таблицей, возбуждается исключительное условие.
  4. Выполнение оператора происходит так же, как это специфицировано в стандарте SQL/89.


Наконец, последним оператором, который в стандарте SQL/92 отнесен к набору операторов манипулирования данными (аналог в SQL/89 отсутствует), является оператор объявления временной таблицы. Реальное создание такой таблицы происходит при первом вызове какой-либо процедуры модуля, содержащего объявление. Объявляемая временная таблица видна только процедурам этого модуля. Синтаксис объявления следующий:

<temporary table declaration> ::= DECLARE LOCAL TEMPORARY TABLE <qualified local table name> <table element list> [ ON COMMIT { PRESERVE DELETE } ROWS ] <qualified local table name> ::= MODULE <period> <local table name>

Пояснения:

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



  • Содержание раздела