Операторы Insert, Update и Delete Назад В начало Вперед

Модификаторы (операции модификации) - это процедуры работы с базой данных.

<модификатор> = <тип-операции>
  [ current | <параметр-визуализации> ][ <атрибуты-delete> ]
  [ <игнорировать-филиальность> ]
  ( <таблица-для-модификации> | viewTable )
  [ <список-таблиц-для-выборки> ]
  [ <условие-where> ] [ <порядок-сортировки-узла> ]
  <операторы-присваивания> ;

<тип-операции> - указывает, какое действие необходимо произвести над таблицей:

<тип-операции> = insert | update | delete

insert - вставить запись: добавляет новую запись в таблицу. Если после insert стоит current, то добавляется запись из буфера, иначе добавляется запись со значениями полей, указанными в операторах присваивания. Остальные поля получают значения по умолчанию.

update - изменить запись. Изменяет существующую запись или множество записей, удовлетворяющих условию where. Изменяемые поля указываются в операторах присваивания. Все остальные поля остаются без изменений.

delete - удалить запись. Удаляет текущую запись или множество записей, удовлетворяющих условию where.

current - модификация происходит только для текущей записи, находящейся в буфере. Условия из where игнорируются. Не может быть указано для модификатора добавления записи insert (т.к. не имеет смысла).

Если current отсутствует, то модификация производится для всех записей, удовлетворяющих ограничениям из where. Количество обработанных записей можно узнать с помощью функции RowCount.

После групповых операций модификации позиция в модифицируемой таблице не определена.

Пример 1.

update Employee set salary = salary + 100;
message(chr(3)+'Обработано записей:' + RowCount);

Модификатор из данного примера увеличит на сто рублей зарплату у всех сотрудников.

Пример 2.

delete current Employee;

Данный модификатор удалит текущую запись из таблицы сотрудников. Модификаторы данного типа имеют смысл только там, где имеет смысл понятие "Текущая запись". Попытка запустить модификацию текущей записи из интерактивной среды SQL или из строчного компилятора приведет к ошибке "Потеря позиции".

<параметр-визуализации> - управляет визуализацией процесса модификации базы:

<параметр-визуализации> = noVisual
  | visual [ <строка-пояснение-для-визуализации> ]

noVisual - не отображать индикатор процесса выполнения операции.

visual - отображать индикатор процесса выполнения операции.

<строка-пояснение-для-визуализации> - строковая константа, надпись в окне визуализации.

Только строковая константа. Использовать имена переменных и другие идентификаторы нельзя.

Если в операторе на момент начала выполнения известно общее количество обрабатываемых записей (например, обновляется или очищается таблица полностью, без установленных ограничений), то будет использоваться числовая визуализация, иначе - прокручиваемая визуализация (см. StartNewVisual).

<атрибуты-delete> - атрибуты, управляющие сообщениями при удалении записей. По умолчанию удаление записей при отсутствии ограничений и условий (нет ни current ни <условие-where>) блокируется. При этом выдается предупреждение на стадии компиляции и сообщение об ошибке на стадии выполнения, записи из таблицы не удаляются.

<атрибуты-delete> = all | safe

all - разрешить удаление записей при отсутствии ограничений и условий. Никаких предупреждений не выдается, удаляются все записи.

safe - предупреждение на стадии компиляции не выдается. Сообщение об ошибке на стадии выполнения выдается, записи из таблицы не удаляются.

<игнорировать-филиальность> - конструкция setBranch, позволяющая менять поле Atl_branch независимо от текущего значения филиальности. См. также "Работа с филиальностью. ". Конструкция используется только в операторах insert и update.Доступна начиная с Атлантис 5.3.18.

<игнорировать-филиальность> = setBranch [ (<условие>) ]

<условие> - опциональный параметр setBranch, включающий этот режим при истинности выражения. Может использоваться для написания общего кода, когда заранее неизвестно, надо вручную выставлять Atl_branch или нет.

Если <условие> истинно или отсутствует, то система будет в модифицируемых записях устанавливать поле Atl_branch, заданное прикладником. В противном случае поле Atl_branch будет заполняться системой в соответствии с текущей настройкой филиальности.

Помимо указания ключевого слова setBranch необходимо также обычным способом задать значение Atl_branch:

T.Atl_branch := xxxh;
update setBranch current T;

или

insert setBranch(true) Appendix set Atl_branch := 3;

Если значение Atl_branch не задано (фактически, если поле не изменено), то несмотря на наличие конструкции setBranch значение Atl_branch будет стандартным.

Исключение: конструкция insert setBranch <table> set <операторы-присваивания>, где в <операторах-присваивания> отсутствует Atl_branch. В этом случае значение Atl_branch будет равно 0. Эту особенность впоследствии планируется изменить на стандартное поведение.

Вложенная выборка данных (insert from select, update where) в любом случае будет происходить в соответствии с текущими филиальными ограничениями.

На точки расширения, прикладные триггеры, модификации из Паскаля данная конструкция, заданная снаружи, действовать не будет.

Для таблиц, открытых в памяти, заполнение Atl_branch работает в режиме WriteThru (сразу в БД пишется указанное значение) или при MTGetNextNRec(<table>, true). В последнем случае указанное значение пишется в ТП, а в БД попадает на этапе Flush, ручном или автоматическом.

Пример.

Во всех вставляемых и изменяемых записях полю Atl_branch будет присвоено значение 1 вне зависимости от наличия филиальности, текущего филиала(ов), динамически переключенных филиалов (с помощью SetBranches):

set atl_branch=1;
insert current setbranch mytable;

insert current setbranch mytable set atl_branch=1;

atl_branch:=1;
update current setbranch mytable;

modifyfilials:=true;
update setbranch(modifyfilials) mytable set atl_branch=1 where ((myvalue==mytable.myfield));

<таблица-для-модификации> - указывает, с какой таблицей будет работать модификатор.

<таблица-для-модификации> = <одна-таблица-из-выборки>

Если не указана таблица для модификации, то начиная с Атлантис 5.4.23 компилятор выдает предупреждение: "Модификатор <название> выполняется для всей логической таблицы". Подавить сообщение можно использованием viewTable.

viewTable - явно связывает оператор с главной логической таблицей.

<список-таблиц-для-выборки> - конструкция from для таблиц, участвующих в конструкции <условие-where>. См. "Список таблиц для выборки. ". В данной конструкции можно специфицировать таблицы, не объявленные в логической таблице интерфейса. Например, это единственный способ модифицировать таблицы, принадлежащие разным компонентам, из интерактивного SQL:

update C_CORE::PrjExecutors
from
  C_STAFF::KatPersons
where
((
	'Сидоров'	 == KatPersons.LastName
  and KatPersons.NRec == PrjExecutors.NREC
))
  set PrjExecutors.Quantp := 5;

Начиная с Атлантис 5.4.23 секция from в конструкциях update, delete в коде интерфейсов запрещена.

<условие-where> - ограничение на множенство модифицируемых записей. См. "Конструкция where. ".

<порядок-сортировки-узла> - см. "Описание порядков сортировки записей. ".

<операторы-присваивания> - служат для описания изменений полей записи, которые необходимо производить перед модификацией каждой записи из множества задействованных записей. В операторе insert, после которого не стоит слово current, все не указанные в операторах присваивания поля заполняются значениями по умолчанию.

<операторы-присваивания> =
		 set <оператор-присваивания> [, <оператор-присваивания> ]
<оператор-присваивания> =
		<поле-таблицы> := <арифметическое-выражение>

В случае если используется конструкции update <Таблица> set <Выражения> либо insert <Таблица> set <Выражения>, в выражениях присваивания необходимо указывать имена полей вместе с именем таблицы, т.к. таблица, которая модифицируется, не является той таблицей, из которой поля берутся по умолчанию. Таким образом, не указав явно имя таблицы можно модифицировать одну таблицу, а значения присваивать полям другой.

В случае неудачного завершения операции модификации модификатор, не включенный в арифметическое выражение, САМ выдает сообщение об ошибке. Если данное сообщение необходимо заменить, то можно включить вызов модификатора в какое либо вычисляемое выражение. После этого он становится функцией, возвращающей код возврата и никаких сообщений, кроме сообщений о фатальных ошибках, не выдает.

В случае неудачного завершения операции модификации модификатор, не включенный в арифметическое выражение, автоматически вызывает функцию Abort, приводя к аварийному завершению события (см. раздел "Исключения. ").

Примеры

Пример 1

if (delete Employee <> tsOk)
  Message('Ошибка при удалении');

Если результат модификатора Вас не интересует, то для подавления ненужного сообщения можно написать:

if (delete Employee <> tsOk) {};

Пример 2

insert Employee
	set name := 'Иванов Иван Иванович', code=2, salary=100;

В примере в таблицу сотрудников заносится запись о новом сотруднике по имени 'Иванов Иван Иванович' с кодом 2 и зарплатой 100. Остальные поля записи заполняются значениями по умолчанию.

Пример 3

update Employee where ( status <> 'П' )
				 set salary := 0;

В примере всем сотрудникам, работающим не на постоянной основе, устанавливается нулевая зарплата, все поля, кроме salary, остаются без изменений.

Версия

Начиная с Атлантис 5.4.23 секция from в конструкциях update, delete в коде интерфейсов запрещена.

Предупреждение "Модификатор <название> выполняется для всей логической таблицы" и соответствующий ему контроль - начиная с Атлантис 5.4.23.

Начиная с Атлантис 5.3.20 опция setBranch работает с таблицами, открытыми в памяти, с объектными таблицами и с конструкцией insert from select.

Начиная с Атлантис 5.3.18 в операторах insert и update добавлена возможность менять поле Atl_branch независимо от текущего значения филиальности.