2011-09-14 18 views
24

我已經繼承了一些代碼,它將成爲一些額外工作的基礎。看着存儲過程,我看到了很多關聯數組。pls_integer和binary_integer有什麼區別?

其中一些是由binary_integers索引的,一些是由pls_integers索引的。兩者之間有什麼不同嗎?

我在the documentation一看,但除了這行:

的PL/SQL數據類型PLS_INTEGERBINARY_INTEGER是相同的。爲簡單起見,本文檔使用PLS_INTEGER表示PLS_INTEGERBINARY_INTEGER

我在兩者之間找不到任何區別。那有什麼區別?是出於歷史/兼容性的原因?

我使用Oracle 10gR2中

回答

33

歷史原因。他們used to be different before 10g

在8i和9i,PLS_INTEGER是明顯比BINARY_INTEGER更快。


當談到聲明和處理整數,甲骨文提供了大量的選擇,包括:

INTEGER - 在標準包中定義爲NUMBER的一個亞型,這種數據類型中實現一種完全平臺無關的方式,這意味着無論安裝數據庫的硬件如何,您使用NUMBER或INTEGER變量所做的任何工作都應該保持不變。

BINARY_INTEGER - 在標準包定義爲INTEGER的子類型,變量聲明爲BINARY_INTEGER可以31之間-2被分配的值。2 31,又名-2,147,483,647到2,147,483,647。在Oracle9i之前數據庫第2版,BINARY_INTEGER是允許關聯數組(又名,索引表)的唯一的索引數據類型,如在:

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

PLS_INTEGER - 在標準包定義爲亞型的BINARY_INTEGER,聲明爲PLS_INTEGER的變量可以賦值爲-2 31 .. 2 31,又名-2,147,483,647至2,147,483,647。 PLS_INTEGER操作使用機器算術,因此它們通常比NUMBER和INTEGER操作更快。另外,在Oracle數據庫10g之前,它們比BINARY_INTEGER更快。但是,在Oracle數據庫10g中,BINARY_INTEGER和PLS_INTEGER現在是相同的,可以互換使用。

+1

這裏是9i的文檔,其中提到的差異,但沒有進入太多細節:http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96624/03_types.htm#10531無論如何,它現在已經過時了。 – Thilo

+0

很好,謝謝相關鏈接和解釋! – Sathya

+0

但請看下面的鏈接: http://www.oracle.com/technetwork/database/features/plsql/documentation/new-plsql-features-in-action-doc-129893.pdf Binary_Integer的實現基於在哈希像數據結構,所以它應該是更快的搜索 和PLS_INTEGER排序,因爲它們在B上實現* - 樹 – logicalgeek

6

binary_integerpls_integer都是一樣的。兩者都是範圍爲-2,147,648,467到2,147,648,467的PL/SQL數據類型。

integerbinary_integerpls_integer相比非常快。因爲pls_intger在機器算術上運行,而binary_integer在庫運算上運行。

pls_integer來自oracle10g。

binary_integer允許分度整數爲oracle9i的前assocative陣列。

明顯的例子:

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

PLS_INTEGER和BINARY_INTEGER的另一個區別是,當涉及PLS_INTEGER溢出計算的PL/SQL引擎將引發運行時異常。但是,即使存在溢出,涉及binary_integer的計算也不會引發異常。