본문 바로가기

[개발] Programming/Database26

ora-01843: not a valid month, 지정한 월이 부적합합니다. ora-01843 오류 : 오라클에서 위 오류는 날짜 포맷을 잘못 입력한 경우 발생. 영어로는 'not a valid month', 한글로는 '지정한 월이 부적합합니다.' 처음에는 월이 무슨 말인가 했는데, 생각해보니 月을 의미하고 있었습니다. 원인은 TO_DATE() 함수를 사용하는데 잘못된 데이터가 들어오고 있었기 때문입니다. 예를 들면 아래와 같은 경우 날짜가 형식에 맞지 않아 오류가 발생합니다. 1 2 3 SELECT TO_DATE('2190101', 'YYYY-MM-DD') AS DATE FROM TEST_TABLE ; Colored by Color Scripter cs 알고 보니 년도에 0이 하나 빠져있었습니다. '20190101'로 수정하면 더 이상 오류가 발생하지 않습니다. 1 2 3 SE.. 2019. 6. 1.
ora-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다. 오류 ora-01427 오류 오라클에서 하나의 값이 리턴되어야 하는데, 2개 이상의 값이 리턴되면 발생하는 오류. 몇 가지 케이스를 예로 들면, 1. 오라클 함수 null 체크를 할 수 있는 NVL() 함수를 사용할 때 리턴되는 값이 둘 이상이면 발생. 해결 방법은 하나의 값만 리턴하게 만드는 방법 밖에는 없다. 2. WHERE 조건 쿼리에서 WHERE에 비교하는 경우 '='을 사용하면 하나의 값만 비교가 가능함. 근데 만약 2개 이상의 값을 입력하는 경우 오류가 발생. 1 2 3 4 SELECT * FROM TEST_TABLE_A WHERE NAME = (SELECT NAME FROM TEST_TABLE_B) Colored by Color Scripter cs 이때 WHERE 조건에 있는 'SELECT NA.. 2019. 5. 28.
오라클 ORA-01722: 수치가 부적합합니다. ORA-01722: 수치가 부적합합니다. 해당 오류는 오라클에서 데이터 타입이 일치하지 않을 경우 발생합니다. 몇 가지 예를 들어보겠습니다. 1. 함수 결과 데이터 타입이 일치하지 않을 경우 1 2 3 SELECT DECODE(SUPPLY_PRICE, 'Y', 10000, 'Free') AS SUPPLY_PRICE FROM PRICE_TABLE ; Colored by Color Scripter cs 이 경우 결과 컬럼인 'SUPPLY_PRICE'는 Y/N에 따라 NUMBER 타입인 10000이 될 수도 있고, STRING 타입인 'Free'가 될 수 있습니다. 조건에 따라 NUMBER와 STRING 타입이 될수 있으므로 오류가 발생합니다. 문자인 'Free'를 0으로 수정하면 오류는 발생하지 않습니다. .. 2019. 5. 24.
오라클 SELECT 후 UPDATE 쿼리 오라클에서 SELECT와 UPDATE를 한 트렌젝션에 끝내는 방법이다. DB 트렌제션을 줄일 수 있어 효율이 좋은 문법이다. 예1) 테이블 AAA에서 COL1을 조회하여 BBB의 COL2를 업데이트하는 경우 1 2 3 4 5 6 UPDATE AAA SET COL1= ( SELECT COL2 FROM BBB WHERE 조건 ) WHERE 조건 ; cs * 주의사항 * 업데이트할 컬럼 COL1와 COL2는 동일한 속성의 칼럼이어야 한다. (컬럼의 데이터 타입, 사이즈 등) 예2) 테이블 AAA에서 COL1, COL2을 조회하여 BBB의 COL1, COL2를 업데이트하는 경우 1 2 3 4 5 6 UPDATE AAA SET COL1, COL2 = ( SELECT COL1, COL2 FROM BBB WHERE .. 2019. 4. 9.
오라클 SELECT 절에 문자 합치는 방법 쿼리를 작성하다보면 가끔 문자열을 조합하는 경우가 있습니다.그때 or 에 해당되는 || 를 사용하면 쉽게 해결할 수 있습니다. 구문 형태 SELECT 문자열 || 문자열 FROM DUAL; 예1) 결과: AB SELECT 'A' || 'B' FROM DUAL; 예2) 결과: Hello SELECT 'Hell' || 'o' FROM DUAL; 2019. 2. 21.
iBATIS, CDATA를 적는 목적 xml 문서내 쿼리안에 , & 등의 특수문자가 포함 될 경우 에러를 방지하기 위해 를 추가해준다. SELECT * FROM DUAL WHERE A C ]]> CDATA를 사용하지 않고 iBatis에서 사용하려면, 다음과 같이 처리하면 된다. SELECT * FROM DUAL WHERE A > B AND B < C 또한 내에서 다이나믹 쿼리는 쓰지 못한다. 2018. 11. 7.
iBatis 오라클 NUMBER 타입, java.math.BigDecimal cannot be cast to java.lang.String 에러 해결 방법 오라클 쿼리 리턴 데이터 타입이 NUMBER 인 경우 컨트롤러 단 HashMap에서 get 할 때 'java.math.BigDecimal cannot be cast to java.lang.String' 오류 발생 * myNumber 데이터 타입은 NUMBER String pNum = numMap.get("myNumber")); > java.math.BigDecimal cannot be cast to java.lang.String NUMBER 타입을 string 변수에 담으려다 발생한 오류이다. * 아래와 같이 변환해주면 호출이 가능함. String pNum = String.valueOf(numMap.get("myNumber")); 2018. 11. 6.
MyBatis, 쿼리 파라미터 # 와 $ 의 차이점 마이바티스에서 #, $의 차이는 옵티마이저 동작의 여부이다. select * from testTable where id = #{testId} select * from testTable where id = ${testId} $의 경우 #와는 달리 SQL 인젝션 공격에 취약한 단점이 있지만, 장점은 옵티마이져가 실행되기 때문에 적절한 플랜으로 쿼리가 돌아간다. 예를 들어, EMPLOYEE 테이블에 POSITION 이라는 컬럼에 아래와 같은 데이터가 있다고 가정하자. 사원 900명 대리 500명 로얄패밀리 10명 경영진 2명 테이블에서 '사원'이나 '대리'를 자주 추출할 때에는 Full Scan이 유리하고 상대적으로 적은 '로얄패밀리'나 '경영진'을 추출할 때에는 Index 스캔이 유리하다. 이때 '$'를 사.. 2018. 11. 5.