2011-09-14 8 views
24

Ho ereditato del codice che diventerà la base per alcuni lavori aggiuntivi. Osservando i proc memorizzati, vedo un bel po 'di array associativi.Qual è la differenza tra pls_integer e binary_integer?

Alcuni di questi sono indicizzati da binary_integers, alcuni da pls_integers. Ci sono differenze tra i due?

ho dato un'occhiata a the documentation, ma a parte questa linea:

tipi di dati

Il PL/SQL PLS_INTEGER e BINARY_INTEGER sono identici. Per semplicità, questo documento utilizza PLS_INTEGER per indicare sia PLS_INTEGER e BINARY_INTEGER.

Non ho trovato alcuna differenza tra i due. Quindi qual è la differenza? Sono entrambi in giro per motivi storici/di compatibilità?

Utilizzo Oracle 10gR2

risposta

33

Ragioni storiche. Essi used to be different before 10g:

Su 8i e 9i, PLS_INTEGER era notevolmente più veloce di BINARY_INTEGER.


Quando si tratta di dichiarare e manipolare interi, Oracle offre un sacco di opzioni, tra cui:

INTEGER - definita nel pacchetto standard come un sottotipo di numero, questo tipo di dati è implementato in una modalità completamente indipendente dalla piattaforma, il che significa che qualsiasi cosa tu faccia con le variabili NUMBER o INTEGER dovrebbe funzionare allo stesso modo indipendentemente dall'hardware su cui è installato il database.

BINARY_INTEGER - definita nel pacchetto standard come un sottotipo di INTEGER, le variabili dichiarate come BINARY_INTEGER possono essere assegnati valori compresi tra -2 31 .. 2 31, aka -2.147,483647 millions a 2.147.483.647. Prima di Oracle9i Database Release 2, BINARY_INTEGER era l'unico tipo di dati indicizzazione consentita per gli array associativi (aka, indice-by tavoli), come in:

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

PLS_INTEGER - definita nel pacchetto standard come un sottotipo di BINARY_INTEGER, le variabili dichiarate come PLS_INTEGER possono essere assegnate a valori compresi tra -2 31 .. 2 31, ovvero -2.147.483.647 a 2.147.483.647. Le operazioni PLS_INTEGER usano l'aritmetica della macchina, quindi sono generalmente più veloci delle operazioni NUMBER e INTEGER. Inoltre, prima di Oracle Database 10g, sono più veloci di BINARY_INTEGER. In Oracle Database 10g, tuttavia, BINARY_INTEGER e PLS_INTEGER ora sono identici e possono essere utilizzati in modo intercambiabile.

+1

Ecco i documenti 9i, che menzionano la differenza, ma senza entrare nei dettagli: http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96624/03_types.htm#10531 In ogni caso, è obsoleto ora. – Thilo

+0

Ah bello, grazie per i link pertinenti e la spiegazione! – Sathya

+0

Ma guarda il link sottostante: http://www.oracle.com/technetwork/database/features/plsql/documentation/new-plsql-features-in-action-doc-129893.pdf L'implementazione di Binary_Integer si basa su Hash come la struttura dei dati, quindi dovrebbe essere più veloce per la ricerca e PLS_INTEGER per l'ordine in quanto sono implementati su B * -Trees – logicalgeek

6

binary_integer e pls_integer entrambi sono uguali. Entrambi sono tipi di dati PL/SQL con intervallo -2.147.648.467 a 2.147.648.467.

Rispetto a integer e binary_integerpls_integer molto veloce in eccitazione. Perché pls_intger opera su aritmetica macchina e operazioni binary_integer sull'aritmetica della libreria.

pls_integer proviene da oracle10g.

binary_integer consente l'indicizzazione di un intero per array associativi prima di oracle9i.

chiaro esempio:

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

Un'altra differenza tra pls_integer e BINARY_INTEGER è che quando i calcoli che coinvolgono un overflow pls_integer il motore PL/SQL solleveranno un'eccezione fase di esecuzione. Ma i calcoli che coinvolgono un oggetto binario non solleveranno un'eccezione anche se c'è un overflow.