Шрифт:
Значение может быть:
* константой корректного типа (например, SET COLUMNB = '99'). Если для столбца указан набор символов, отличный от набора символов соединения, то заменяющее значение может быть преобразовано в этот указанный набор символов с помощью включения соответствующего дескриптора набора символов слева от константы. Дескриптор набора символов является именем набора символов, который начинается с символа подчеркивания, например:
SET COLUMNY = _ISO8859_1 'fricassee'
* идентификатором другого столбца в той же таблице, представленным с корректным типом данных. Например, SET COLUMNB = COLUMNX заменит текущее значение столбца COLUMNB на текущее значение столбца COLUMNX. При необходимости может быть использован дескриптор набора символов (см. ранее);
* выражением. Например, SET REVIEW_DATE = REVIEW_DATE + 14 изменяет значение столбца даты на две недели позже, чем текущее значение. Подробнее о выражениях см. главу 21;
* контекстной переменной сервера (например, SET DATE_CHANGED = CURRENT_DATE). Контекстные переменные описаны в главе 8;
* символом-заменителем параметра, соответствующим синтаксису, реализованному в коде приложения (например, для Delphi SET LAST_NAME = :LAST_NAME ИЛИ, для других интерфейсов приложений, SET LAST_NAME = ?);
* вызовом определенной пользователем функции (UDF). Например, SET BCOLUMN = OPPER(ACOLUMN) использует внутреннюю SQL-функцию UPPER для преобразования значения столбца ACOLUMN в верхний регистр и сохранения результата в BCOLUMN. Информацию об использовании функций см. в главе 21.
Предложение COLLATE может быть включено при модификации символьных столбцов (но не BLOB). для большинства наборов символов может оказаться необходимым использование одного из предыдущих примеров, поскольку последовательность сортировки по умолчанию (двоичная) обычно не поддерживает функцию UPPER. Например, если ACOLUMN и BCOLUMN описаны с набором символов ISO8859_1 и используют испанский язык, то предложение SET должно быть следующим:
SET BCOLUMN = UPPER (ACOLUMN) COLLATION ES_ES
Подробнее о наборах символах и последовательностях сортировки см. главу 11.
Будьте осторожны при "переключении" значений между столбцами. Выражение типа
. . .
SET COLUMNA = COLUMNB
приведет к тому, что текущее значение в столбце COLUMNA будет немедленно заменено текущим значением столбца COLUMNB. Если затем вы сделаете
SET COLUMNB = COLUMNA
то, поскольку старое значение столбца COLUMNA было потеряно, значения столбцов COLUMNB и COLUMNA останутся теми же, что и после первого переключения.
Для переключения значений вам нужен третий столбец, в котором будет "парковаться" значение из COLUMNA, пока вы не будете готовы назначить его столбцу
COLUMNB:
. . .
SET
COLUMNC = COLUMNA,
COLUMNA = COLUMNB, COLUMNB = COLUMNC
. . .
В SET вы можете использовать выражения, следовательно, при переключении двух целых значений возможно использование арифметических операций над двумя значениями. Предположим, что COLUMNA равняется 10, a COLUMNB 9:
. . .
SET
COLUMNB = COLUMNB + COLUMNA, /* COLUMNB теперь 19 */
COLUMNA = COLUMNB - COLUMNA, /* COLUMNA теперь 9 */
COLUMNB = COLUMNB - COLUMNA /* COLUMNB теперь 10 */
. . .
Всегда проверяйте ваши предположения при выполнении переключений!
Изменение столбцов BLOB фактически полностью заменяет старое значение BLOB на новое. Старый указатель BLOB ID при изменении заменяется. Также:
* невозможно изменить BLOB путем конкатенации другого BLOB или строки с существующим BLOB;
* значение текстового BLOB может быть установлено с использованием строки в качестве ввода. Например, MEMO в следующем примере является текстовым BLOB:
UPDATE ATABLE
SET MEMO = 'Friends, Romans, countrymen, lend me your ears: I come not to bury Caesar, but to praise him.';
! ! !
ВНИМАНИЕ! Помните, что хотя столбцы BLOB не ограничены по размерам, строковые типы ограничены 32 765 байтами (VARCHAR) или 32 767 байтами (CHAR) - это байты, а не символы. Учтите это при конкатенации многобайтовых наборов символов.