Quelle est la différence entre pls entier et entier binaire?
J'ai hérité du code qui va être la base pour un travail supplémentaire. En regardant les procs stockés, je vois beaucoup de tableaux associatifs.
Certains d'entre eux sont indexés par binary_integers, certains par pls_integers. Existe-il des différences entre les deux?
J'ai regardé la documentation , mais en dehors de cette ligne:
Les types de données PL/SQL
PLS_INTEGER
etBINARY_INTEGER
sont identiques. Pour simplifier, ce document utilise PLS_INTEGER pour signifier les deuxPLS_INTEGER
etBINARY_INTEGER
.
Je n'ai trouvé aucune différence entre les deux. Alors, quelle est la différence? Sont-ils tous les deux là pour des raisons historiques/de compatibilité?
J'utilise Oracle 10gR2
3 réponses
Raisons Historiques. Ils étaient différents avant 10g :
Sur 8i et 9i, PLS_INTEGER était nettement plus rapide que BINARY_INTEGER.
Quand il s'agit de déclarer et de manipuler des entiers, Oracle offre beaucoup d'options, y compris:
INTEGER-défini dans le package STANDARD comme un sous-type de NUMBER, ce type de données est implémenté de manière complètement indépendante de la plate-forme, ce qui signifie que tout ce que vous faites avec NUMBER ou Les variables entières doivent fonctionner de la même manière quel que soit le matériel sur lequel la base de données est installée.
BINARY_INTEGER-défini dans le paquet STANDARD comme un sous-type D'entier, les variables déclarées comme BINARY_INTEGER peuvent recevoir des valeurs comprises entre -2 31 .. 2 31, alias -2 147 483 647 à 2 147 483 647. Avant la version 2 De La base de données Oracle9i, BINARY_INTEGER était le seul type de données d'indexation autorisé pour les tableaux associatifs (aka, index-By tables), comme dans:
TYPE my_array_t IS TABLE OF VARCHAR2(100)
INDEX BY BINARY_INTEGER
PLS_INTEGER-défini dans le paquet STANDARD comme un sous-type de BINARY_INTEGER, les variables déclarées comme PLS_INTEGER peuvent se voir attribuer des valeurs entre -231 .. 231, alias -2 147 483 647 à 2 147 483 647. Les opérations PLS_INTEGER utilisent l'arithmétique de la machine, de sorte qu'elles sont généralement plus rapides que les opérations de nombre et D'entier. En outre, avant Oracle Database 10g, ils sont plus rapides que BINARY_INTEGER. Dans Oracle Database 10g, cependant, BINARY_INTEGER et PLS_INTEGER sont maintenant identiques et peuvent être utilisés de façon interchangeable.
binary_integer
et pls_integer
les deux sont les mêmes. Les deux sont des types de données PL/SQL avec une plage de -2 147 648 467 à 2 147 648 467.
Par Rapport à integer
et binary_integer
pls_integer
très rapide dans l'excution. Parce que pls_intger
fonctionne sur l'arithmétique de la machine et binary_integer
fonctionne sur l'arithmétique de la bibliothèque.
pls_integer
vient de oracle10g.
binary_integer
permet d'indexer un entier pour les tableaux associés avant oracle9i.
Exemple Clair:
SET TIMING ON
declare
num integer := 0;
incr integer := 1;
limit integer := 100000000;
begin
while num < limit loop
num := num + incr;
end loop;
end;
PL/SQL procedure successfully completed.
Elapsed: 00:00:20.23
ex:2
declare
num binary_integer := 0;
incr binary_integer := 1;
limit binary_integer := 100000000;
begin
while num < limit loop
num := num + incr;
end loop;
end;
/
PL/SQL procedure successfully completed.
Elapsed: 00:00:05.81
ex:3
declare
num pls_integer := 0;
incr pls_integer := 1;
limit pls_integer := 100000000;
begin
while num < limit loop
num := num + incr;
end loop;
end;
/
Une autre différence entre pls_integer et binary_integer est que lorsque les calculs impliquant un débordement pls_integer le moteur PL / SQL déclenche une exception d'exécution. Mais, les calculs impliquant un binary_integer ne déclencheront pas d'exception même s'il y a un débordement.