본문 바로가기
반응형

IT/DB22

art1 [ORACLE] "May 8, 2022 12:41:37 AM" TO_DATE하기 인터페이스를 통해 데이터를 받아 저장하는 경우가 많습니다. xml, json 등으로 받은 데이터 중 날짜 정보를 Date 타입의 DB에 저장해야되는데, 데이터 송신부 측 날짜 형식이 지멋대로인 경우가 많습니다. 간단하게 DATE 타입으로 변환하는 TO_DATE 방법을 알아보겠습니다. TO_DATE 예제 [ May 8, 2022 12:41:37 AM ] 2022-05-12 13:01:23 20220512130123 일반적으로 위와 같은 형식으로 오는 경우가 많습니다. 이런 경우는 서버에서 특수문자 replace를 하거나 SQL에서 'YYYY-MM-DD HH24:MI:SS'로 TO_DATE 하는게 익숙합니다. May 8, 2022 12:41:37 AM 하지만 수신된 DATE 형식이 이런 경우면 조금 당황스러.. 2022. 5. 12.
art1 [Mybatis] java.lang.RuntimeException: parameter[MI] no set 해결방법 자주 발생하는 오류는 아닐 것 같지만 충분히 겪을 수 있는 상황일 것 같은데, 검색해도 잘 안 나오길래 직접 해결해보고 공유드립니다. 에러 상황 java.lang.RuntimeException: parameter[MI] no set 분명 DB툴에서는 정상 작동하는데 서버에서 실행하니 위 에러가 발생합니다. MI가 뭘까 한참 고민했는데, 문제는 SQL에 있었습니다. 문제 SQL 예시 SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL 문제는 Mybatis에서 콜론(:)은 파라미터를 받을 때 쓰는 특수문자이기 때문입니다. 분을 나타내는 :MI가 파라미터로 인식되어 MI는 없다고 에러가 나는 것입니다. 해결방법 1) CDATA 추가 일반적으로 쿼리에서 특수.. 2022. 4. 8.
art1 [ORACLE] 타임스탬프로 과거데이터 조회 복구하기 (TIMESTAMP) 업무를 진행하면서 본인이 혹은 팀내 다른 직원이 DELETE 문을 실행하면서 WHERE 절을 잘 못 걸어 지우면 안되는 데이터들이 지워질 때가 있습니다. COMMIT 전이라면 롤백하면 되지만 COMMIT 후라면, 그리고 지운 데이터가 기준정보라 시스템에 중요 데이터라면 머리가 아찔해집니다. 이런 경우 당황하지말고 TIMESTAMP로 복구가 가능합니다. 실수로 지운 데이터 복구하기 오라클9i 이상 버전부터 가능합니다. 아마 대부분 9i 이상일 겁니다. -- 10분 전 데이터 조회 SELECT * FROM 테이블명 AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '10' MINUTE) WHERE 조건 -- 1시간 전 데이터 조회 SELECT * FROM 테이블명 AS OF TIMESTAM.. 2022. 2. 18.
art1 [Oracle] 오라클 더 크고, 작은 값 비교와 주의할 점 GREATEST, LEAST(최대/최소값) GREATEST와 LEAST는 SELECT 절에 쓰이는 MIN, MAX() 그룹함수와 유사하지만 각기 다른 값들의 크기를 비교하는데 주로 쓰입니다. 가장 빠른 날짜를 구하거나 가장 큰 숫자를 구할 때 자주 쓰입니다. 사용방법에 대해서 알아보겠습니다. GREATEST, LEAST 함수 사용법 두 함수는 기본적으로 사용법이 동일하고 매우 간단히 나열만 하면 됩니다. 최대값 반환 = GREATEST( 변수1, 변수2, 변수3, ... ) 최소값 반환 = LEAST( 변수1, 변수2, 변수3, ... ) SELECT GREATEST( 1, 2, 3, 4, 5 ) , LEAST( SYSDATE, TO_DATE('2021-12-08', 'YYYYMMDD') ) DAUL 주의사항(DATA Type, NULL, lis.. 2022. 1. 18.
art1 [Oracle] 오라클 시퀀스(Sequence) 생성/수정/삭제/currval/nextval DB에서 주로 pk값의 채번을 위해 자주 사용하는 시퀀스에 대해 알아보도록 하겠습니다. 현재 계정이 가지고 있는 전체 시퀀스 조회 방법, 생성, 수정, 삭제 방법 그리고 각 시퀀스 현재값, 다음값 조회 방법까지 알아보겠습니다. 목차 1. 시퀀스 조회 (전체 조회, 현재값, 다음값) 2. 시퀀스 생성/수정/삭제 1. 시퀀스 조회 1) 시퀀스 전체 조회 (Oracle Dictionary) -- 오라클 딕셔너리 조회 SELECT * FROM ALL_SEQUENCES 각 시퀀스의 소유자, 명칭, 최소/최대값, 증감, 현재 채번된 마지막 번호까지 한 번에 조회가 가능합니다. 시퀀스 전수조사할 일이 있을 때 사용하면 간단히 해결됩니다. 2) 시퀀스 현재/다음값 조회 (currval, nextval) -- 현재값 S.. 2021. 12. 30.
art1 [ORACLE] ORA-01732 : 뷰에 대한 조작이 부적합합니다. ORA-01732의 경우 뷰를 INSERT, UPDATE, DELETE 하는 경우 발생할 수 있습니다. 예시 SQL UPDATE V_USER_INFO SET PWD = '1111' WHERE USER_ID = 'A' 아마 해당 에러가 발생하신 분들은 이와 같은 뷰에 대해 직접 수정을 하려고 하고 있을 것입니다. 일반적인 뷰의 경우에는 문제없이 수행되지만 뷰가 UNION, GROUP BY 등으로 선언된 경우는 ORA-01732가 발생합니다. 해결 방법 이런 경우 뷰를 직접 수정하면 안 되고 뷰 내부의 테이블에 직접 수정해야 합니다. Description을 통해 뷰를 열어봅시다. (오렌지의 경우 F4) CREATE VIEW V_USER_INFO ( USER_ID, PWD ) AS SELECT USER_ID .. 2021. 12. 22.
art1 [ORACLE] 널(NULL)에 대한 IN과 NOT IN 오라클에서 WHERE 절에 IN이나 NOT IN을 쓰는 경우가 많다. IN () 다음의 괄호에는 1000건 이상이 들어가면 에러가 난다. 이 문제는 바로 에러가 터지기 때문에 미리 알기 쉬운데, 비교값에 NULL이 들어가는 문제는 당장 SQL에러가 나진 않기 때문에 알기 어렵습니다. 이번에 업무에서 유사한 사례로 조회돼야 할 건이 누락되어 공유합니다. IN, NOT IN NULL 문제 예시 아래와 같이 매장 테이블이 있고, 영업여부를 조건으로 조회하는 쿼리를 예로 들어보자. 홍대점의 영업여부가 NULL이 들어가 있다. [매장 TABLE] 영업여부 매장명 Y 강남점 N 용산점 홍대점 IN의 경우 아래와 같은 쿼리를 작성하면 강남점과 홍대점이 나와야 될 것 같지만, NULL은 나오지 않는다. NULL은 IN.. 2021. 11. 27.
art1 [ORACLE] NULL 값 정렬 (ORDER BY NULLS FIRST OR LAST) 업무를 하다보면 널(NULL)이 포함된 컬럼을 기준으로 정렬하고 싶을 때가 있다. 기존 데이터는 ASC든 DESC든 정렬을 하고 널은 맨 앞에 아니면 맨 뒤에 두고 싶을 때 UNION을 하고 있었다면 아래 ORDER BY의 추가 옵션을 알아보도록 하겠습니다. NULLS 옵션 NULLS FIRST SELECT * FROM TABLE ORDER BY AAA DESC NULLS FIRST ; -- 결과 NULL NULL 3 2 1 NULLS LAST SELECT * FROM TABLE ORDER BY AAA NULLS LAST ; -- 결과 1 2 3 NULL NULL 간단히 NULL을 정렬해보자. 2021. 11. 24.
art1 [ORACLE] DB Tool 한글 깨짐 현상 해결 방법(오렌지, Toad 등) 특정 캐릭터 셋의 경우 오렌지나 Toad 같은 DB 툴에서 한글이 깨져서 ???라고 나오는 경우가 있습니다. 이런 경우 해결하는 방법에 대해 알아보겠습니다. 예시는 오렌지로 들겠지만, 그 외 툴의 경우도 해결이 가능합니다. 1. DB 캐릭터 셋 확인 SELECT (SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_LANGUAGE') || '_' || (SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_TERRITORY') || '.' || (SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET') F.. 2021. 11. 24.
art1 [ORACLE] PL/SQL 에러 PLS-00363 : 프로시저 실행 안 될 때 해결방법 * PLS-00363은 오라클에서 프로시저(procedure)나 함수(function)를 호출할 때 파라미터에 오류가 있을 때 발생합니다. * 해당 에러는 프로시저에 OUT 변수가 있을 때 발생 할 수 있습니다. OUT 변수가 포함된 프로시저 -- 선언문 ( IN변수 2개, OUT변수 1개 ) CREATE OR REPLACE PROCEDURE FIND_NAME( p_birth IN VARCHAR2 p_gender IN VARCHAR2 p_name OUT VARCHAR2 ) -- 호출 시도 중 에러 발생 EXEC FIND_NAME( 'BIRTH' , 'GENDER', 'RESULT' ); -- PLS-00363 : expression 'RESULT' cannot be used as an assignment.. 2021. 10. 29.
art1 [ORACLE] MERGE문 무결성 제약조건 위배의 경우 (ORA-00001) CHAR 타입으로 인한 MERGE문 실행 시 무결성 오류가 나는 경우 * MERGE문은 조건에 만족하면 INSERT와 UPDATE로 알아서 분기된다. 두 개 이상의 세션에서 동시에 날려서 PK가 중복된 경우는 당연히 발생 가능하다. 그런데 난 혼자 개발 중인데 왜 무결성 오류가 날까? * 우선 에러가 발생한 쿼리를 먼저 보면 ON절에 키값 1개만 걸린 매우 기본적인 MERGE문이다. MERGE INTO TABLE_A A USING DUAL ON (A.KEY1 = #KEY1#) WHEN MATCHED THEN UPDATE SET () WHEN NOT MATCHED THEN INSERT () VALUES () * 이 쿼리 실행 시 무결성 오류가 난다면 KEY1의 데이터 타입이 CHAR 인지 확인해보자. * .. 2021. 10. 26.
art1 [ORACLE] 오라클 데이터타입 CHAR와 VARCHAR2의 차이 * 문자형 데이터 타입 중 CHAR와 VARCHAR2의 차이를 알아보자. * CHAR의 경우 아래 상황으로 인한 특수한 상황을 제외하고는 CHAR보다는 VARCHAR2 사용을 권장한다. CHAR와 VARCHAR2의 차이 1) VARCHAR2 ( size BYTE | CHAR ) * VARCHAR2(10 BYTE), VARCHAR2(10 CHAR) 등으로 선언 가능하며 BYTE/CHAR를 입력하지 않으면 기본값은 BYTE이다. * VARCHAR2는 4000byte까지 사용 가능하고, 가변길이로 10byte로 생성해도 값이 5byte면 데이터는 5byte이다. * 위 사진과 같이 EDIT 모드에서 커서가 값 뒤에 붙는다. 2) CHAR ( size BYTE | CHAR ) * CHAR(10 BYTE), CH.. 2021. 10. 26.