티스토리 뷰

반응형

🚀  들어가며...

한적한 오후, 커피를 마시며 쉬고있는데 운영기 키바나에 오류가 하나 접수되었습니다.  다음과 같은 오류이더군요.

psycopg2.DataError: 오류: 정수 범위를 벗어남

오류의 원인을 분석하는데 쿼리상에는 문제가 전혀 없어보였는데 생각지않게 꿀팁 하나를 알게되어서 알려드리려고 합니다.

 

💌 소스코드

(보안문제로 소스코드 부분을 삭제했습니다.)

 

📑 내용

문제가 발생했던 쿼리문의 일부를 가져왔습니다.

쿼리를 보시게 되면 저는 처음에는 제일 위에 SUM으로 길게 묶인 TOT_PAY라는 임시컬럼이 숫자가 너무 커서 계산결과가 정수범위를 벗어난것은 아닐까? 하는 의심을 하게 됩니다.

하지만 FROM절에 테이블(보안으로 인한 익명의 테이블)을 조회해보았는데 SUM한 컬럼들이 모두 NUMERIC 형식이어서 이상이 없다고 판단하였습니다.

두번째로는 임시로 생성한 Temptable에 INSERT 하는 과정에서 Temptable의 컬럼이 NUMERIC 또는 BIGINT 형식이 아닌 INT 인데 넣으려고 하는 숫자는 INT범위를 넘어가서 발생하는 오류가 아닐까 하는 의심을 하였습니다.

그래서 여러가지 실험을 해보았습니다.

위에 쿼리를 보면 TEMP_TOT2라는 임시테이블을 만들때 이런 쿼리문을 씁니다.

CREATE TEMP TABLE TEMP_TOT2 ON COMMIT DROP AS
SELECT  ''::CHAR(10) AS CD_ACCTIT ,0 AS TOTPAY2, 0 AS TOTFREE2 WHERE 1 = 0;

저는 이 부분을 의심해보게 되었고, 테스트를 해보았습니다.

 

SELECT SUM(1)
SELECT 0 AS NUM

놀랍게도, sum한 결과는 bigint이지만, 숫자 컬럼은 int형식인 것을 알 수 있었습니다.

정확하게 얘기하자면,

SELECT 숫자

이런 형태의 SQL문이라면, 숫자의 길이만큼 데이터타입이 자동 변하게 됩니다.

위 예시에서는 SELECT 0 이어서 길이가 INT에 맞게 자동 세팅이 된 것이죠.

따라서 해결 방법은 위 쿼리에서 TEMP_TOT2 임시테이블 생성 시 TOTPAY2와 TOTFREE2 컬럼을 BIGINT 형식으로 형변환하여 테이블을 생성해 주면 정수범위를 벗어난다는 오류는 발생하지 않을 것입니다.

 

🙋🏻‍♂️ 후기

누구에게는 이걸 몰라? 하는 반응이었을 수도 있습니다. 저는 이번 오류 해결 과정으로써 평소에 당연하다고 생각하거나 쉽게 넘어가는 부분도 자세히 한번 더 보자! 라는 결심을 하게되었고, 항상 중요하지만 Temp Table 생성시에도 데이터타입은 굉장히 중요하다는 것을 다시한번 느꼈습니다. 데이터 타입을 신경쓰지 않는다면 후에 분명히 오류발생으로 돌아올 것입니다!

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함