2011-09-14 57 views
24

Heredé algún código que será la base para un trabajo adicional. Al observar los procs almacenados, veo bastantes arreglos asociativos.¿Cuál es la diferencia entre pls_integer y binary_integer?

Algunos de estos están indexados por binary_integers, algunos por pls_integers. ¿Hay alguna diferencia entre los dos?

Yo tenía un aspecto en the documentation, pero aparte de esta línea:

tipos de datos

El PL/SQL PLS_INTEGER y BINARY_INTEGER son idénticos. Para simplificar, este documento usa PLS_INTEGER para referirse tanto a PLS_INTEGER como a BINARY_INTEGER.

No pude encontrar ninguna diferencia entre los dos. Entonces, ¿cuál es la diferencia? ¿Ambos están por razones históricas/de compatibilidad?

Estoy usando Oracle 10gR2

Respuesta

33

razones históricas. Ellos used to be different before 10g:

En 8i y 9i, PLS_INTEGER fue notablemente más rápido que BINARY_INTEGER.


Cuando se trata de la declaración y la manipulación de números enteros, Oracle ofrece un montón de opciones, incluyendo:

INTEGER - definida en el paquete estándar como un subtipo de NÚMERO, este tipo de datos se implementa en una forma completamente independiente de la plataforma, lo que significa que cualquier cosa que haga con las variables NUMBER o INTEGER debería funcionar igual independientemente del hardware en el que esté instalada la base de datos.

BINARY_INTEGER - definida en el paquete estándar como un subtipo de INTEGER, las variables declaradas como BINARY_INTEGER pueden asignar valores entre -2 31 .. 2 31, también conocido como -2147483647 a 2147483647. Antes de la base de datos Oracle9i Release 2, BINARY_INTEGER era el único tipo de datos de indexación permitido para matrices asociativas (también conocido como índice de tablas), como en:

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

PLS_INTEGER - definida en el paquete estándar como un subtipo de BINARY_INTEGER, las variables declaradas como PLS_INTEGER se pueden asignar valores entre -2 31 .. 2 31, también conocido como -2,147,483,647 a 2,147,483,647. Las operaciones PLS_INTEGER utilizan la aritmética de la máquina, por lo que generalmente son más rápidas que las operaciones NUMBER e INTEGER. Además, antes de Oracle Database 10g, son más rápidos que BINARY_INTEGER. En Oracle Database 10g, sin embargo, BINARY_INTEGER y PLS_INTEGER ahora son idénticos y se pueden usar indistintamente.

+1

Aquí están los documentos 9i, que mencionan la diferencia, pero sin entrar en muchos detalles: http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96624/03_types.htm#10531 De todos modos, está obsoleto ahora. – Thilo

+0

¡Ah bien, gracias por los enlaces relevantes y la explicación! – Sathya

+0

Pero mira el siguiente enlace: http://www.oracle.com/technetwork/database/features/plsql/documentation/new-plsql-features-in-action-doc-129893.pdf La implementación de Binary_Integer se basa en Hash como estructura de datos, por lo que debería ser más rápido buscar y PLS_INTEGER para realizar el pedido, ya que se implementan en B * -Teas – logicalgeek

6

binary_integer y pls_integer son iguales. Ambos son tipos de datos PL/SQL con un rango de -2,147,648,467 a 2,147,648,467.

En comparación con integer y binary_integerpls_integer muy rápido en ejecución. Debido a que pls_intger opera en aritmética de máquina y binary_integer se utiliza en la aritmética de la biblioteca.

pls_integer viene de oracle10g.

binary_integer permite indexar un entero para matrices asociativas antes de oracle9i.

Ejemplo claro:

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; 
/
4

Otra diferencia entre PLS_INTEGER y binary_integer es que cuando los cálculos que implican un desbordamiento PLS_INTEGER el motor PL/SQL provocará una excepción en tiempo de ejecución. Pero los cálculos que involucren un binary_integer no generarán una excepción incluso si hay un desbordamiento.

Cuestiones relacionadas