Regras para conversões
As regras nesta seção se aplicam a conversões que envolvem literais numéricos. Para os fins dessas regras, os seguintes termos são definidos:
Atribuição de loja: Ao enviar dados para uma coluna de tabela em um banco de dados. Isso ocorre durante chamadas para SQLExecute, SQLExecDirect e SQLSetPos. Durante a atribuição do repositório, "target" refere-se a uma coluna de banco de dados e "source" refere-se a dados em buffers de aplicativo.
Atribuição de recuperação: Ao recuperar dados do banco de dados em buffers de aplicativo. Isso ocorre durante chamadas para SQLFetch, SQLGetData, SQLFetchScroll e SQLSetPos. Durante a atribuição de recuperação, "target" refere-se aos buffers de aplicativo e "source" refere-se à coluna de banco de dados.
CS: O valor na origem do caractere.
NT: O valor no destino numérico.
NS: O valor na origem numérica.
CT: O valor no destino do caractere.
Precisão de um literal numérico exato: o número de dígitos que ele contém.
A escala de um literal numérico exato: o número de dígitos à direita do período expresso ou implícito.
A precisão de um literal numérico aproximado: a precisão de sua mantissa.
Origem do caractere para destino numérico
A seguir estão as regras para converter de uma Origem de Caractere (CS) em um destino numérico (NT):
Substitua CS pelo valor obtido removendo espaços à esquerda ou à direita em CS. Se CS não for um literal numérico válido, SQLSTATE 22018 (valor de caractere inválido para especificação de conversão) será retornado.
Substitua CS pelo valor obtido removendo zeros à esquerda antes do ponto decimal, à direita de zeros após o ponto decimal ou ambos.
Converter CS em NT. Se a conversão resultar em uma perda de dígitos significativos, SQLSTATE 22003 (valor numérico fora do intervalo) será retornado. Se a conversão resultar na perda de dígitos não insignificantes, SQLSTATE 01S07 (truncamento fracionário) será retornado.
Origem numérica para destino de caractere
A seguir estão as regras para converter de uma Origem Numérica (NS) em um destino de caractere (CT):
Deixe LT ter o comprimento em caracteres de CT. Para a atribuição de recuperação, LT é igual ao comprimento do buffer em caracteres menos o número de bytes no caractere de terminação nula para esse conjunto de caracteres.
Casos:
Se NS for um tipo numérico exato, permita que YP seja igual à cadeia de caracteres mais curta que está em conformidade com a definição de exact-numeric-literal de modo que a escala de YP seja igual à escala de NS e o valor interpretado de YP seja o valor absoluto de NS.
Se NS for um tipo numérico aproximado, permita que YP seja uma cadeia de caracteres da seguinte maneira:
Capitalização:
Se NS for igual a 0, YP será 0.
Deixe o YSN ser a cadeia de caracteres mais curta que está em conformidade com a definição de exact-numeric-literal e cujo valor interpretado é o valor absoluto de NS. Se o comprimento do YSN for menor que o (precisão + 1) do tipo de dados do NS, deixe YP igual a YSN.
Caso contrário, YP é a cadeia de caracteres mais curta que está em conformidade com a definição de approximate-numeric-literal cujo valor interpretado é o valor absoluto de NS e cuja mantissa consiste em um único dígito que não é '0', seguido por um ponto e um inteiro sem sinal.
Capitalização:
Se ns for menor que 0, deixe Y ser o resultado de:
'-' || YP
em que '||' é o operador de concatenação de cadeia de caracteres.
Caso contrário, deixe Y igual a YP.
Deixe LY ser o comprimento em caracteres de Y.
Capitalização:
Se LY for igual a LT, CT será definido como Y.
Se LY for menor que LT, CT será definido como Y estendido à direita pelo número apropriado de espaços.
Caso contrário (LY > LT), copie os primeiros caracteres LT de Y em CT.
Capitalização:
Se essa for uma atribuição de repositório, retorne o erro SQLSTATE 22001 (Dados de cadeia de caracteres, truncados à direita).
Se essa for a atribuição de recuperação, retorne o aviso SQLSTATE 01004 (dados de cadeia de caracteres, truncados à direita). Quando a cópia resulta na perda de dígitos fracionários (além de zeros à direita), é definido pelo driver se um dos seguintes ocorre:
(1) O driver trunca a cadeia de caracteres em Y em uma escala apropriada (que também pode ser zero) e grava o resultado em CT.
(2) O driver arredonda a cadeia de caracteres em Y para uma escala apropriada (que também pode ser zero) e grava o resultado em CT.
(3) O driver não trunca nem arredonda, mas apenas copia os primeiros caracteres LT de Y para CT.