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 et BINARY_INTEGER sont identiques. Pour simplifier, ce document utilise PLS_INTEGER pour signifier les deux PLS_INTEGER et BINARY_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

24
demandé sur Jeromy French 2011-09-14 11:28:15

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.

34
répondu Thilo 2018-03-12 08:06:00

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;
/ 
7
répondu nagu 2011-12-20 14:19:53

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.

5
répondu Gebru Welay 2012-10-26 21:03:06