web-dev-qa-db-fra.com

Quelle est la différence entre pls_integer et binary_integer?

J'ai hérité d'un code qui va être la base d'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. Y a-t-il des différences entre les deux?

J'ai jeté un œil à la documentation , mais à part cette ligne:

Les types de données PL/SQL PLS_INTEGER et BINARY_INTEGER sont identiques. Pour simplifier, ce document utilise PLS_INTEGER pour signifier à la fois PLS_INTEGER et BINARY_INTEGER.

Je n'ai trouvé aucune différence entre les deux. Alors quelle est la différence? Les deux sont-ils présents pour des raisons historiques/de compatibilité?

J'utilise Oracle 10gR2

27
Sathyajith Bhat

Raisons historiques. Ils autrefois avant 10g :

Sur 8i et 9i, PLS_INTEGER était sensiblement plus rapide que BINARY_INTEGER.


Lorsqu'il s'agit de déclarer et de manipuler des entiers, Oracle propose de nombreuses options, notamment:

INTEGER - défini dans le package STANDARD comme un sous-type de NUMBER, ce type de données est implémenté de manière totalement indépendante de la plate-forme, ce qui signifie que tout ce que vous faites avec les variables NUMBER ou INTEGER devrait 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 package STANDARD comme un sous-type de INTEGER. Les variables déclarées comme BINARY_INTEGER peuvent recevoir des valeurs comprises entre -231+1 .. 231-1, alias -2.147.483.647 à 2.147.483.647. Avant Oracle9i Database Release 2, BINARY_INTEGER était le seul type de données d'indexation autorisé pour les tableaux associatifs (aka, tables d'indexation), comme dans:

  TYPE my_array_t IS TABLE OF VARCHAR2(100) 
  INDEX BY BINARY_INTEGER

PLS_INTEGER - défini dans le package STANDARD en tant que sous-type de BINARY_INTEGER. Les variables déclarées comme PLS_INTEGER peuvent recevoir des valeurs comprises entre -231+1 .. 231-1, alias -2.147.483.647 à 2.147.483.647. Les opérations PLS_INTEGER utilisent l'arithmétique machine, elles sont donc généralement plus rapides que les opérations NUMBER et INTEGER. De plus, avant Oracle Database 10g, ils sont plus rapides que BINARY_INTEGER. Dans Oracle Database 10g, cependant, BINARY_INTEGER et PLS_INTEGER sont désormais identiques et peuvent être utilisés de manière interchangeable.

37
Thilo

binary_integer et pls_integer les deux sont les même. 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_integerpls_integer très rapide en excution. Car pls_intger fonctionne sur l'arithmétique des machines et binary_integer fonctionne sur l'arithmétique de bibliothèque.

pls_integer provient d'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;
/ 
8
nagu

Une autre différence entre pls_integer et binary_integer est que lorsque les calculs impliquant un débordement de pls_integer le moteur PL/SQL lèvera une exception d'exécution. Mais, les calculs impliquant un binary_integer ne déclencheront pas d'exception même en cas de débordement.

5
Gebru Welay