SET BIND
Modifier la liaison de type. Assurer la compatibilité avec les anciens clients.
SET BIND OF {<type-from> | TIME ZONE} TO { <type-to> | LEGACY | EXTENDED | NATIVE }
Paramètre | Description |
---|---|
type-from |
Le type de données pour lequel la règle de conversion est spécifiée. |
type-to |
Le type de données à convertir. |
Cet opérateur vous permet de définir des règles pour décrire les types retournés au client d’une manière non standard — le type type-from est automatiquement converti en type type-to.
Si une définition de type incomplète est utilisée (par exemple, CHAR
au lieu de CHAR(n)
) sur le côté gauche de l’induction SET BIND OF
,alors la conversion sera faite pour toutes les colonnes CHAR
, et pas seulement CHAR(1)
.
Le type spécial incomplet TIME ZONE
dénote tous les types, à savoir {TIME | TIMESTAMP} WITH TIME ZONE
.Lorsqu’une définition de type incomplète est utilisée dans la partie droite de la déclaration (la partie TO
),le serveur définira automatiquement les détails manquants de ce type sur la base de la colonne d’origine.
La modification de la liaison d’un type NUMERIC
et DECIMAL
n’affecte pas le type entier sous-jacent correspondant.Inversement, la modification de la liaison d’un type de données entier affecte également les NUMERIC
et DECIMAL
correspondants.
Le mot-clé LEGACY
dans la partie TO
est utilisé lorsqu’un type de données non présent dans une version précédente de Firebird doit être représenté d’une manière compréhensible pour un logiciel client plus ancien (une certaine perte de données peut se produire). Il existe les conversions suivantes pour les types LEGACY
:
Type natif | Type d’héritage |
---|---|
BOOLEAN |
CHAR(5) |
DECFLOAT |
DOUBLE PRECISION |
INT128 |
BIGINT |
TIME WITH TIME ZONE |
TIME WITHOUT TIME ZONE |
TIMESTAMP WITH TIME ZONE |
TIMESTAMP WITHOUT TIME ZONE |
L’utilisation de EXTENDED
dans la partie TO
force Firebird à utiliser le formulaire de type étendu dans la partie FROM.Actuellement, cela ne fonctionne que pour {TIME | TIMESTAMP} WITH TIME ZONE
— ils sont appliquésen EXTENDED {TIME | TIMESTAMP} WITH TIME ZONE
.
Mettre NATIVE
signifie que le type sera utilisé comme s’il n’y avait pas de règles de conversion précédentes pour lui.
La même fonctionnalité peut être obtenue en utilisant le tag isc_dpb_set_bind
dans DPB.En outre, la conversion de type vers les anciens types disponibles dans les versions précédentes de Firebird peut être définie à l’aide du paramètre DataTypeCompatibility
dans firebird.conf ou databases.conf.Plus la règle est entrée tard (.conf
→ DPB → SQL), plus sa priorité est élevée.
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; --toujours double
CAST ======================= 123.4500000000000
SELECT CAST('123.45' AS DECFLOAT(34)) FROM RDB$DATABASE; --text
CAST ========================================== 123.45
SET BIND OF TIME ZONE TO EXTENDED
S’il n’y a pas de bibliothèque ICU du côté client, le résultat de la prochaine requête sera erroné
SELECT CURRENT_TIMESTAMP FROM RDB$DATABASE;
CURRENT_TIMESTAMP ========================================================= 2020-02-21 16:26:48.0230 GMT*
Afin d’obtenir la valeur du décalage horaire par rapport à l’heure GMT, procédez comme suit
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
Modifier le mode d’arrondi et le comportement d’erreur pour le type 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
SET DECFLOAT ROUND
L’opérateur SET DECFLOAT ROUND
change le mode d’arrondi pour la session en cours.Les modes d’arrondi suivants, compatibles IEEE, sont pris en charge :
Arrondissement à partir du haut. Si tous les chiffres rejetés sont des zéros ou si le signe du nombre est négatif, le dernier chiffre non rejeté reste le même. Dans le cas contraire, le dernier chiffre non rejeté est incrémenté de un (arrondi à l’unité supérieure).
Arrondissement à partir de zéro (troncature avec incrément). Les valeurs rejetées sont ignorées.
Arrondi à la valeur la plus proche. Cette option est utilisée par défaut. Si le résultat est équidistant, l’arrondi au chiffre supérieur est effectué. Si les valeurs écartées sont supérieures ou égales à la moitié (0,5) de un à la position gauche suivante, le dernier chiffre non écarté est incrémenté de un (arrondi vers le haut). Sinon, les valeurs rejetées sont ignorées.
Arrondi à la valeur la plus proche. Si le résultat est équidistant, l’arrondi est effectué de manière à ce que le dernier chiffre soit pair. Si les valeurs rejetées sont supérieures à la moitié (0,5) d’une unité dans la position suivante à gauche, le dernier chiffre non rejeté est incrémenté d’une unité (arrondi à l’unité supérieure). S’ils sont inférieurs à la moitié, le résultat n’est pas corrigé, c’est-à-dire que les chiffres rejetés sont ignorés. Dans le cas contraire, lorsque les valeurs rejetées sont exactement égales à la moitié, le dernier chiffre non rejeté est inchangé s’il est pair et incrémenté d’une unité (arrondi au chiffre supérieur) dans le cas contraire (pour obtenir un chiffre pair). Ce mode d’arrondi est également appelé arrondi de banque et donne une impression d’arrondi équitable.
Arrondir à la valeur la plus proche. Si le résultat est équidistant, l’arrondi au chiffre inférieur est effectué. Si les valeurs écartées sont supérieures ou égales à la moitié (0,5) de un dans la position gauche suivante, le dernier chiffre non écarté est décrémenté de un (arrondi vers le bas). Sinon, les valeurs rejetées sont ignorées.
Arrondi vers zéro (troncature). Les valeurs rejetées sont ignorées.
Arrondi vers le bas. Si tous les chiffres écartés sont des zéros ou si le signe est positif, le dernier chiffre non écarté ne change pas. Dans le cas contraire (signe négatif), le dernier chiffre non rejeté est incrémenté de un.
Arrondi à une valeur supérieure si l’arrondi est de 0 ou 5, sinon l’arrondi est à une valeur inférieure.
SET DECFLOAT ROUND HALF_DOWN;
Modes d’arrondi | 12.341 | 12.345 | 12.349 | 12.355 | 12.405 | -12.345 |
---|---|---|---|---|---|---|
CEILING |
12.35 |
12.35 |
12.35 |
12.36 |
12.41 |
-12.34 |
UP |
12.35 |
12.35 |
12.35 |
12.36 |
12.41 |
-12.35 |
HALF_UP |
12.34 |
12.35 |
12.35 |
12.36 |
12.41 |
-12.35 |
HALF_EVEN |
12.34 |
12.34 |
12.35 |
12.36 |
12.40 |
-12.34 |
HALF_DOWN |
12.34 |
12.34 |
12.35 |
12.35 |
12.40 |
-12.34 |
DOWN |
12.34 |
12.34 |
12.34 |
12.35 |
12.40 |
-12.34 |
FLOOR |
12.34 |
12.34 |
12.34 |
12.35 |
12.40 |
-12.35 |
REROUND |
12.34 |
12.34 |
12.34 |
12.36 |
12.41 |
-12.34 |