Одиночные операторы
Основной набор одиночных операторов манипулирования данными и смысл этих операторов в 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> ]
Как обычно, основные расширения касаются более мощных возможностей спецификации условия поиска. Кроме того:
- Если текущая транзакция выполняется в режиме только чтения, и таблица, из которой удаляются строки, не является временной, возбуждается исключительное условие.
- Пометка строк для удаления производится следующим образом:
(a) если условие поиска не специфицировано, то все строки таблицы помечаются для удаления;
(b) заданное условие поиска применяется для каждой строки указанной таблицы, и каждая строка, для которой условие поиска вычисляется в true, помечается для удаления.
- Как и в случае позиционных операторов обновления, если для некоторой строки обнаруживается, что она уже помечена для обновления (удаления или модификации) другим оператором (позиционным или поисковым), то в условии завершения оператора поискового удаления возвращается предупреждение.
- Все строки, помеченные для удаления, реально удаляются в конце оператора до проверки какого-либо ограничения целостности.
- Если не удалена ни одна строка, вырабатывается условие завершения "нет данных".
Оператор поисковой модификации обладает почти таким же синтаксисом, что и соответствующий оператор в 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 относятся к более мощным возможностям определения условия поиска. Другие расширения и уточнения затрагивают следующее:
- Если текущая транзакция выполняется в режиме только чтения и таблица, строки которой модифицируются, не является временной, то возбуждается исключительное условие.
- Пометка строк для модификации производится следующим образом:
(a) если условие поиска не специфицировано, то все строки таблицы помечаются для модификации;
(b) заданное условие поиска применяется для каждой строки указанной таблицы, и каждая строка, для которой условие поиска вычисляется в true, помечается для модификации.
- Как и в случае позиционных операторов обновления, если для некоторой строки обнаруживается, что она уже помечена для обновления (удаления или модификации) другим оператором (позиционным или поисковым), то в условии завершения оператора поисковой модификации возвращается предупреждение.
- Если набор объектных строк пуст, вырабатывается условие завершения "нет данных".
Синтаксис оператора вставки строк в 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>
Пояснения относительно расширений и уточнений:
- Если в разделе вставляемых столбцов и источников данных указано DEFAULTVALUES, то это эквивалентно заданию выражения запроса в форме VALUES(DEFAULT, . . .), где число элементов "DEFAULT" равно числу столбцов в таблице T, в которую заносится строка.
- Столбец, указанный в списке вставляемых столбцов, называется объектным.
- Если текущая транзакция выполняется в режиме только чтения и T не является временной таблицей, возбуждается исключительное условие.
- Выполнение оператора происходит так же, как это специфицировано в стандарте 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>
Пояснения: