Правила преобразования
Правила, приведенные в этом разделе, применяются к преобразованиям, включающим числовые литералы. В целях этих правил определяются следующие термины:
Назначение хранилища: при отправке данных в столбец таблицы в базе данных. Это происходит во время вызовов SQLExecute, SQLExecDirect и SQLSetPos. Во время назначения хранилища целевой объект относится к столбцу базы данных и источнику относится к данным в буферах приложений.
Назначение извлечения: при получении данных из базы данных в буферы приложений. Это происходит во время вызовов SQLFetch, SQLGetData, SQLFetchScroll и SQLSetPos. Во время назначения извлечения целевой объект ссылается на буферы приложения и "источник" ссылается на столбец базы данных.
CS: значение в источнике символов.
NT: значение в числовом целевом объекте.
NS: значение в числовом источнике.
CT: значение в целевом объекте символов.
Точность точного числового литерала: количество цифр, содержащихся в нем.
Масштаб точного числового литерала: количество цифр справа от выраженного или подразумеваемого периода.
Точность приблизительного числового литерала: точность его мантиссы.
Источник символов в числовой целевой объект
Ниже приведены правила преобразования из источника символов (CS) в числовой целевой объект (NT):
Замените CS значением, полученным путем удаления всех начальных или конечных пространств в CS. Если CS не является допустимым числовым литералом, возвращается SQLSTATE 22018 (недопустимое значение символа для спецификации приведения).
Замените CS значением, полученным путем удаления начальных нулей до десятичной запятой, завершая нули после десятичной запятой или обоих.
Преобразование CS в NT. Если преобразование приводит к потере значительных цифр, возвращается SQLSTATE 22003 (числовое значение вне диапазона). Если преобразование приводит к потере незначимых цифр, возвращается SQLSTATE 01S07 (дробное усечение).
Числовой источник в целевой объект символов
Ниже приведены правила преобразования из числового источника (NS) в целевой объект символов (CT):
Пусть LT будет длиной символов CT. Для назначения извлечения LT равно длине буфера в символах минус количество байтов в символах, в символах завершения null для этого набора символов.
Случаях:
Если NS является точным числовым типом, пусть YP равно самой короткой строке символов, которая соответствует определению точного числового литерала , таким образом, что масштаб YP совпадает с масштабом NS, а интерпретируемое значение YP является абсолютным значением NS.
Если NS является приблизительным числовым типом, пусть YP будет символьной строкой следующим образом:
Регистр:
Если NS равно 0, то YP равно 0.
Позвольте YSN быть самой короткой строкой символов, которая соответствует определению точного числового литерала и чей интерпретируемый значение является абсолютным значением NS. Если длина YSN меньше (точность + 1) типа данных NS, то пусть YP равно YP YSN.
В противном случае YP является самой короткой строкой символов, которая соответствует определению приблизительно-числовых литералов, интерпретируемое значение которого является абсолютным значением NS и мантиссасостоит из одной цифры, которая не является "0", за которой следует период и целое число без знака.
Регистр:
Если NS меньше 0, пусть Y будет результатом:
'-' || YP
где '||' — это оператор объединения строк.
В противном случае пусть Y равно YP.
Позвольте LY быть длиной в символах Y.
Регистр:
Если значение LY равно LT, то для CT задано значение Y.
Если значение LY меньше LT, то ct имеет значение Y, расширенное справа по соответствующему количеству пробелов.
В противном случае (LY > LT), скопируйте первые LT-символы Y в CT.
Регистр:
Если это назначение хранилища, верните ошибку SQLSTATE 22001 (строковые данные, усеченные по правому краю).
Если это назначение извлечения, верните предупреждение SQLSTATE 01004 (строковые данные, усеченные по правому краю). Если копия приводит к потере дробных цифр (кроме конечных нулей), она определяется драйвером, происходит ли одно из следующих действий:
(1) Драйвер усечение строки в Y до соответствующего масштаба (который также может быть нулевым) и записывает результат в CT.
(2) Драйвер округляет строку в Y до соответствующего масштаба (который также может быть нулевым) и записывает результат в CT.
(3) Драйвер не усечен или округляет, но просто копирует первые LT-символы Y в CT.