2013-05-28 2 views
1

MYTABLE을 생성 한 Oracle 테이블의 경우 COL1 열이 NUMBER (20,3)로 선언됩니다. 소수점 다음에 3 자리 유효 숫자를 가질 수 있습니다. 이 테이블에서 cx_Oracle 커서를 실행할 때 :cx_Oracle 커서 집계에서 열 스케일을 잊어 버림

cursor.execute('SELECT COL1 FROM MYTABLE') 

cursor.description 
>> [('COL1', <type 'cx_Oracle.NUMBER'>, 25, 22, 20, 3, 1)] 

cursor.execute('SELECT SUM(COL1) FROM MYTABLE') 

cursor.description 
>> [('SUM(COL1)', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1)] 

두 번째 경우에는 정밀도와 배율을 잃어 버렸습니다. 데이터 자체는 괜찮습니다 (그리고 소수점 이하의 값을 보여줍니다).

예상되는 데이터 유형을 알기 위해 신뢰할 수있는 방법이 필요합니다. 그래서 클라이언트 UI에서 데이터의 형식을 지정하는 방법을 결정할 수 있습니다. 커서 설명을 살펴보면 유효 숫자가 없음 두 번째 경우에는 소수점이 허용되고, UI 로직 다운 스트림은 숫자를 정수로 렌더링하므로 바람직하지 않습니다.

버그입니까? 그렇다면 두 번째 경우에는 커서에서 예상 할 수있는 데이터를 명확하게 파악할 수있는 방법이 있습니까?

답변

2

정확도와 스케일이 제한된 숫자에 함수를 적용 할 때 ORA-01438 오류를 피하기 위해 오라클의 기본 노력이 있다고 생각합니다. 기본적으로 식 (COL1/COL2) 또는 AVG (COL1)에 COL1 및 COL2의 정밀도와 배율을 적용하지 않으려합니다.

따라서 Oracle은 정밀도와 스케일에 제한이없는 일반 NUMBER 데이터 유형을 적용합니다. 나는 VarChar2 함수와 비슷한 것을한다고 믿는다. 당신이 (22)의 정밀도를 초과하는 경우 당신이 얻을 것이다하지만 결과에

Cast(Sum(col1) as Number(22,3)) 

:

ORA-01438: value larger than specified precision allowed for this column 

을 시도 가치가있을 수도 있습니다 무엇

명시 적으로 합계() 결과를 캐스팅하는 것입니다 마지막으로, 크기를 초과해도 오류가 발생하지 않습니다. 지정된 배율을 초과하면 가능한 최대 배율로 반올림됩니다.