오라클 3

[Oracle] 만나이 구하기

보통 나이를 구할때, sql에서 생년월일을 가져온 후, java 단에서 가공하는 형식으로 많이 사용하였다. 이번에 요구사항으로 검색조건에 나이를 사용할 일이 있어서, sql 에서 구하도록 방법을 찾아보았고, 다음과 같은 방법을 찾을 수 있었다. SELECT TRUNC(MONTHS_BETWEEN(TRUNC(SYSDATE), TO_DATE('19000101','YYYYMMDD')) / 12) FROM DUAL 그런데, 꼭 날짜를 이상하게 넣는 사람들이 있어, 실행시 오류가 발생하는 경우가 확인되었다. 날짜 변환시에 오류가 발생하는 경우 이를 감지해서 회피하도록 다음과 같은 방법으로 조치하였다. SELECT DECODE(VALIDATE_CONVERSION(p.birth_date AS DATE, 'YYYYMMD..

Development/Etc 2024.01.16

[Oracle] CLOB 조회 - 매우 긴 문자열

오라클에서는 문자를 저장하는 VARCHAR2가 최대 4000자까지만 지원되어, 그 이상의 데이터는 CLOB에 저장을 하였다. 그런데, 이는 반대로 읽어올때도 문제가 되는데, 읽어올때도 4000자 이상은 읽어오지를 못하였다. 게다가 CLOB에 저장된 데이터는 평범하게 SELECT column 으로는 조회가 모두 되지 않아, 아래와 같이 조회하여야 했다. 방법1 SELECT DBMS_LOB.SUBSTR(col1, DBMS_LOB.GETLENGTH(col1)) FROM MyTable 그런데, 이때 col1의 크기가 4000을 넘어가면 또 에러가 발생한다. 위와 같이 방법을 찾아 진행했었는데, 해당 Query의 결과를 Java단에서 정상적으로 읽지를 못하였다. 방법2 그래서, Query는 기존 그대로 사용하여 ..

Development/Etc 2020.03.05

[Oracle] 여러 row 하나로 합치기

주로 MySql을 사용하다 오랜만에 Oracle을 사용하니 생각보다 불편한 점이 많았다. 이전에 Oracle에서 MySql로 넘어왔을때도 그랬었는데... 그중 여러 row를 하나의 Column으로 합칠때 찾아보니 Oracle 버전마다 방법이 모두 달라 정리해보기로 했다. 테스트는 9버전대에서 진행하였고, 10 이후 버전은 테스트를 못해봤지만 동작하리라 추측한다. SELECT type , SUBSTR(XMLAgg(XMLElement(x, ',', name) ORDER BY code).Extract('//text()'), 2) name_9i , wm_concat(name) name_10g , ListAgg(name, ',') WITHIN GROUP(ORDER BY code) name_11g FROM t GR..

Development/Etc 2020.03.05