'ORA-01722: 수치가 부적합합니다'

Oracle 쿼리 실행하다보면 자주 발생하는 에러중 하나입니다.

 

집계함수를 사용하던 중에 발생한 오류를 해결한 과정입니다.

'date_column'에 'yyyy-mm-dd'형태의 일자가 있고, 'a_columnm'에 날짜별 데이터가 있다고 가정했을때,

날짜별로 'a_columnm'이 갖는 값들에 대해 count를 하려합니다.

SELECT TO_CHAR(date_column, 'YYYY-MM') AS month,
       a_column,
       COUNT(*) AS count_per_value
FROM your_table_name
GROUP BY TO_CHAR(date_column, 'YYYY-MM'), a_column
ORDER BY month, a_column;

 

위 쿼리만 봤을 때 문제없이 실행되어야 하지만 'ORA-01722: 수치가 부적합합니다' 에러가 발생합니다.

TO_CHAR() 함수가 실행될 때 데이터 형식에 관련된 문제라고 판단되어 쿼리를 아래와 같이 실행하였습니다.

SELECT TO_CHAR(TO_DATE(date_column), 'YYYY-MM') AS month,
       a_column,
       COUNT(*) AS count_per_value
FROM your_table_name
GROUP BY TO_CHAR(TO_DATE(date_column), 'YYYY-MM'), a_column
ORDER BY month, a_column;

 

'date_column'의 형 변환을 TO_DATE(date_column) 처럼 해준 뒤에 실행하니 정상적으로 실행되었습니다.

다시 확인해보니 'date_column'의 형식이 character형식이었네요.

 

이처럼 oracle은 데이터 형시에 더 민감한 모습을 보여줍니다.

허무하게 해결되었네요 :)

키워드 'with' 근처의 구문이 잘못되었습니다. 이 문이 공통 테이블 식이거나, xmlnamespaces 절이거나, 변경 내용 추적 컨텍스트 절인 경우에는 이전 문을 세미콜론으로 종료해야 합니다.

  MSSQL에서 임시테이블(with)쿼리를 작성하다보면 위와 같은 에러가 종종 발생합니다.

해결은 허무할 만큼 에러 메시지에 간단하게 나와있습니다

'With'앞에 세미콜론(;)만 붙여주면 됩니다.

-- WITH 앞에 세미콜론을 붙여주세요 --
;WITH '임시테이블명' AS (
			SELECT *
			  FROM	A   
			
			UNION ALL
			
			SELECT *			 
			  FROM	B
			 )
     select * from '임시테이블명'
SELECT TOP 100, 컬럼1, 컬럼2, * FROM 테이블이름;
SELECT TOP 1000 * FROM 테이블이름;

 mysql에선 'limit n'으로 쿼리를 작성하지만 mssql은 select 바로 다음에 'TOP N(숫자)'으로 쿼리를 작성해주면 상위 N개의 결과값이 검색된다.

 생각나서 찾아보니 하위 N개에 대한 쿼리는 없는 듯... order by desc/asc로 처리해주면 된다.

개발환경

  • Windows10 OS
  • SSMS(SQL Server Management Studio) 14버전

 예를 들어서 '사원'의 정보를 갖고 있는 테이블이 있을 때, 사원 테이블에 select/Insert/delete/update 쿼리를 작성or테스트 할 경우가 발생한다.

 단순하겐 테이블의 속성들을 조회하여 일일이 쿼리문을 작성해주면 되지만 시간이 정말 오래걸릴 수도 있고 귀찮은 작업이 될 수 있지만 SSMS에서는 테이블 스크립팅 이라는 기능을 제공하여 테이블의 속성에 맞는 쿼리를 자동으로 생성해 주는 편리한 기능을 제공한다.

데이터베이스 > 테이블 > 작업할 테이블에서 마우스 우클릭 > 새 쿼리 편집기 창 클릭

위 화면 처럼 작업할 테이블을 마우스 우클릭으로 선택 > 테이블 스크립팅 메뉴에 마우스 오버를 해보면 작업할 쿼리를 선택할 수 있다.

개인적으로 insert와 update 쿼리를 자주 사용하는데 insert 테이블 스크립팅을 생성해보면

테이블 속성에 맞는 INSERT 문이 자동으로 생성된다

INSERT 쿼리 문이 생성되며 Values에 친절하게 데이터 타입도 명세되어있으며, 이 부분에 입력할 데이터만 작성해주면 된다

+ Recent posts