2011-09-14 2 views
24

나는 몇 가지 추가 작업의 기초가 될 몇 가지 코드를 물려 받았습니다. 저장된 procs를 살펴보면, 연관 배열 (associative-arrays)이 상당히 많이 있음을 알 수 있습니다.pls_integer와 binary_integer의 차이점은 무엇입니까?

일부는 binary_integers에 의해 색인되고 일부는 pls_integers에 의해 색인됩니다. 둘 사이에 차이점이 있습니까?

PL/SQL 데이터 유형 PLS_INTEGERBINARY_INTEGER이 동일 :

나는 떨어져 있지만이 라인에서, the documentation에보고했다. 간단히하기 위해이 문서에서는 PLS_INTEGER를 사용하여 PLS_INTEGERBINARY_INTEGER을 모두 의미합니다.

둘 사이에 차이점을 찾을 수 없습니다. 차이점은 무엇입니까? 두 가지 모두 역사적/호환성 적 이유입니까?

나는 오라클 10gR2의

답변

33

역사적 이유를 사용하고 있습니다. 그들은 used to be different before 10g는 : 8i를하고 9i에에

, PLS_INTEGER는 BINARY_INTEGER에 비해 눈에 띄게 빨라이었다.


가 선언하고 정수 조작에 관해서

오라클은 다음과 같은 옵션을 많이 제공 :

INTEGER을 - 수의 하위 유형으로 표준 패키지에 정의 된,이 데이터 형식이 구현된다 이는 플랫폼 독립적 인 방식이므로 NUMBER 또는 INTEGER 변수로 수행하는 작업은 데이터베이스가 설치된 하드웨어와 상관없이 동일하게 작동해야합니다.

BINARY_INTEGER - BINARY_INTEGER 선언 INTEGER의 부속으로서 STANDARD 패키지로 정의, 변수, .. 사이 -2 31 일명 -2,147,483,647 2,147,483,647 2 (31) 값을 할당 할 수있다. - 하위 유형으로 표준 패키지에 정의

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

PLS_INTEGER : 오라클 데이터베이스 릴리스 2 이전, BINARY_INTEGER이 같이 연관 배열 (일명, 인덱스에 의해 테이블)에 허용 된 유일한 색인 데이터 유형이었다 BINARY_INTEGER 중 PLS_INTEGER로 선언 된 변수는 -2 31 .. 2 31, 일명 -2,147,483,647에서 2,147,483,647 사이의 값을 할당 할 수 있습니다. PLS_INTEGER 연산은 기계 산술을 사용하므로 일반적으로 NUMBER 및 INTEGER 연산보다 빠릅니다. 또한 Oracle Database 10g 이전 버전은 BINARY_INTEGER보다 빠릅니다. 그러나 Oracle Database 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 모두 동일합니다. 둘 다 PL/SQL 데이터 유형이며 범위는 -2,147,648,467에서 2,147,648,467입니다.

과 비교하면, 방출이 매우 빠름. integerbinary_integerpls_integer과 비교. pls_intger은 기계 산술에서 작동하고 binary_integer은 라이브러리 산술 연산에서 작동하기 때문입니다.

pls_integer은 oracle10g에서옵니다.

binary_integer은 oracle9i 이전의 조합 배열에 대한 색인화 정수를 허용합니다.

클리어 예 :

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와 관련된 계산은 오버플로가 있더라도 예외를 발생시키지 않습니다.

관련 문제