FirebirdSQL logo

SET BIND

Назначение

Изменение привязки типа.Обеспечение совместимости со старыми клиентами.

Синтаксис
SET BIND
  OF {<type-from> | TIME ZONE}
  TO { <type-to> | LEGACY | EXTENDED | NATIVE }
Table 1. Параметры оператора SET BIND OF
Параметр Описание

type-from

Тип данных для которого задаётся правило преобразования.

type-to

Тип данных в который следует преобразовать.

Данный оператор позволяет задать правила описания типов возвращаемых клиенту нестандартным способом — тип type-from автоматически преобразуется к типу type-to.

Если используется неполное определение типа (например CHAR вместо CHAR(n)) в левой части SET BIND OF приведения,то преобразование будет осуществляться для всех CHAR столбцов, а не только для CHAR(1).

Специальный неполный тип TIME ZONE обозначает все типы, а именно {TIME | TIMESTAMP} WITH TIME ZONE.Когда неполное определение типа используется в правой части оператора (часть TO),сервер автоматически определит недостающие детали этого типа на основе исходного столбца.

Изменение связывания любого NUMERIC и DECIMAL типа не влияет на соответствующий базовый целочисленный тип.Напротив, изменение привязки целочисленного типа данных также влияет на соответствующие NUMERIC и DECIMAL.

Ключевое слово LEGACY в части TO используется, когда тип данных, отсутствующий в предыдущей версии Firebird, должен быть представлен способом понятным для старого клиентского программного обеспечения (возможна некоторая потеря данных). Существуют следующие преобразования в LEGACY типы:

Table 2. Преобразования в legacy типы
Native тип Legacy тип

BOOLEAN

CHAR(5)

DECFLOAT

DOUBLE PRECISION

INT128

BIGINT

TIME WITH TIME ZONE

TIME WITHOUT TIME ZONE

TIMESTAMP WITH TIME ZONE

TIMESTAMP WITHOUT TIME ZONE

Использование EXTENDED в части TO заставляет Firebird использовать расширенную форму типа в части FROM.В настоящее время он работает только для {TIME | TIMESTAMP} WITH TIME ZONE — они принудительно приводятсяк EXTENDED {TIME | TIMESTAMP} WITH TIME ZONE.

Установка NATIVE означает, что тип будет использоваться так, как если бы для него не было предыдущих правил преобразования.

Правила привязки типов можно установить на уровне соединения через API. Для этого в функцию соединения необходимо передать DPB со строковым значением тэга isc_dpb_set_bind,в котором предоставлен список опций <type_from> TO <type_to>, разделенных точкой с запятой.

Кроме того, преобразование типов в legacy типы доступные в предыдущих версиях Firebird можно установить с помощью параметра DataTypeCompatibility в firebird.conf или databases.conf.Чем позже введено правило (.conf → DPB → SQL), тем выше его приоритет.

Example 1. Использование SET BIND OF
SELECT CAST('123.45' AS DECFLOAT(16)) FROM RDB$DATABASE;	--native
                   CAST
=======================
                 123.45
SET BIND OF DECFLOAT TO DOUBLE PRECISION;
SELECT CAST('123.45' AS DECFLOAT(16)) FROM RDB$DATABASE;	--double
                   CAST
=======================
      123.4500000000000
SET BIND OF DECFLOAT(34) TO CHAR;
SELECT CAST('123.45' AS DECFLOAT(16)) FROM RDB$DATABASE;	--всё ещё double
                   CAST
=======================
      123.4500000000000
SELECT CAST('123.45' AS DECFLOAT(34)) FROM RDB$DATABASE;	--text
CAST
==========================================
123.45
Example 2. Использование SET BIND OF TIME ZONE TO EXTENDED

Если на стороне клиента отсутствует библиотека ICU, то результат следующего запроса будет таким:

SELECT CURRENT_TIMESTAMP FROM RDB$DATABASE;
                                        CURRENT_TIMESTAMP
=========================================================
2020-02-21 16:26:48.0230 GMT*

Для того чтобы получить значение смещения времени относительно GMT, выполните следующее:

SET BIND OF TIME ZONE TO EXTENDED;
SELECT CURRENT_TIMESTAMP FROM RDB$DATABASE;
                                        CURRENT_TIMESTAMP
=========================================================
2020-02-21 19:26:55.6820 +03:00

SET DECFLOAT

Назначение

Изменение режима округления и поведения при ошибках для типа DECFLOAT.

SET DECFLOAT
  { ROUND <round_mode>
  | TRAPS TO [<trap_opt> [, <trap_opt> ...]] }

<round_mode> ::=
    CEILING | UP | HALF_UP | HALF_EVEN
  | HALF_DOWN | DOWN | FLOOR | REROUND

<trap_opt> ::=
    DIVISON_BY_ZERO | INEXACT | INVALID_OPERATION
  | OVERFLOW | UNDERFLOW