Database/Oracle

ORA-01502: 인덱스 '인덱스명'또는 인덱스 분할영역은 사용할 수 없은 상태입니다 평상시엔 정상적으로 작동하던 insert Query가 갑자기 ORA-01502 오류를 출력하며 작동을 하지 않았다. 원인은 확인해봐야겠지만 간단히 말하면 사용 중이던 인덱스가 사용할 수 없는 상태가 되었기 때문에 출력되는데 아무것도 모르고 처음부터 해결하려고 하면 막막하게 느껴질 수 있으나 사실 매우 간단하게 해결이 가능하다. ALTER INDEX 인덱스명 REBUILD; 를 작성하고 실행 시키니 라는 메시지가 출력되었고, 다시 저장 로직을 실행시키니 정상적으로 작동했다.
ORA-01756: "X": 부적합한 식별자 "%s: invalid identifier" ※ 이 오류는 문자가 들어가는 모든 쿼리문에서 확인할 수 있다. 쿼리를 작성해서 데이터를 조회할 때 보통 WHERE 절을 필수로 사용하는데, 이때 발생하는 오류이다. 아래의 예시를 보면 단번에 이해할 수 있다! SELECT USER_ID, USER_NM FROM TB_USER WHERE USER_NM = 김헌일 위의 쿼리를 보면 '김헌일'이라는 이름을 가진 유저를 모두 조회하도록 작성하였는데 WHERE 절에 ' 문자가 빠져서 발생하는 오류이다. 해결방법은 아래와 같이, 데이터베이스가 조건을 정확하게 인식할 수 있게 ' 문자를 넣어주고, 쿼리를 실행하면 된다. SELECT USER_ID, USER_NM FROM TB_..
ORA-01756: 단일 인용부를 지정해 주십시오 "quoted string not properly terminated" ※ 이 오류는 데이터 조회 시 확인할 수 있다. 쿼리를 작성해서 데이터를 조회할 때 보통 WHERE 절을 필수로 사용하는데, 이때 발생하는 오류이다. 아래의 예시를 보면 단번에 이해할 수 있다! SELECT * FROM TB_USER WHERE USER_NM IN ('김헌일); 따로 설명할 것도 없는데... 해당 쿼리의 USER_NM 조건에 문자열을 닫아주는 ' 가 빠져있어 ORA-01756 오류가 발생한다. 해결 방법은 SELECT * FROM TB_USER WHERE USER_NM IN ('김헌일'); 당연하게도 ' 를 입력해서 열린 문자열을 닫아주면 된다. 끗!
ORA-00979: GROUP BY 표현식이 아닙니다. "not a GROUP BY expression" ※ 이 오류는 데이터 조회 시 자주 확인할 수 있다. 지금 내가 일하고 있는 이곳은 통계 값 요청이 상당히 많다. ~~자격증을 소지하고 있는 자는 몇 명인지, ~~상태값이 Y인 아이디는 몇 개인지, N인 아이디는 몇 개인지 등 위와 같이 통계 값을 요청했을 때 자주 사용하는 것이 GROUP BY 이다. 쉽게 예를 들자면, 1번, 2번 자격증이 있다고 가정하고, 요청자가 1번 자격증을 소지하고 있는 사람의 수, 2번 자격증을 가지고 있는 사람의 수를 뽑아주세요!라고 할 때 이 GROUP BY 를 사용하면 쉽게 구할 수 있다는 것이다! 그럼 GROUP BY 표현식이 아닙니다. 라는 오류는 언제 발생하는지..
ORA-01858: 숫자가 있어야 하는 위치에서 숫자가 아닌 문자가 발견되었습니다. "a non-numeric character was found where a numeric was expected" ※ 데이터 조회 시 날짜 관련 함수(TO_CHAR, TO_DATE 등)를 사용할 때 자주 발생하는 오류이다. 아래의 예시에 있는 질의문을 실행시켜보면, SELECT TO_DATE(SYSDATE, 'yyyymmdd') FROM DUAL; 'ORA-01858 : 숫자가 있어야 하는 위치에서 숫자가 아닌 문자가 발견되었습니다.' 오류가 출력된다. 어떻게 보면 다른 애매모호한 오류 메시지보다 훨씬 직관적이라서 헤맬 필요 없이 쿼리를 수정이 가능하다. 오류가 발생하는 원인은 TO_DATE 함수는 숫자를 문자로 변환해..
ORA-01722: 수치가 부적합합니다 해당 오류는 데이터를 삽입, 수정 시 확인할 수 있다. 간단하게 설명하자면 컬럼의 DATATYPE이 NUMBER인데, 해당 컬럼에 문자를 입력하게 되면 ORA-01722 오류가 발생한다. 위의 오류는 당연하게도 NUMBER 타입의 컬럼에만 국한되지 않고 다른 데이터 타입의 경우도 마찬가지이다. 아래는 예시이다. -- ORA-01722 오류 발생 -- USER_TEL 컬럼의 DATATYPE은 NUMBER라고 가정한다. INSERT INTO TB_USER ( USER_NO, USER_ID, USER_TEL ) VALUES ( '0001', 'kimheon1' '아메리카노' ); USER_TEL 컬럼의 데이터 타입이 NUMBER인데 해당 컬럼에 '아메리카노' 라는 문구를..
ORA-12899 : 열에 대한 값이 너무 큼 "value too large for column" 데이터 삽입, 업데이트 시 많이 마주치는 오류이다. 위 오류는 컬럼에 설정되어 있는 데이터 허용치보다 더 큰 값을 삽입, 업데이트 하는 경우 발생한다. 쉽게 예시를 들어보면, DEL_YN 이라는 컬럼에 데이터 타입이 VARCHAR2(1 BYTE)라고 가정했을 때 입력할 수 있는 값은 알파벳 하나일 것이다. 그런데 이 컬럼에 한글을 넣는다던지, 더 많은 알파벳, 숫자 등 설정한 BYTE보다 더 큰 값을 입력하는 경우 ORA-12899 오류가 출력될 것이다. -- INSERT 과정에서 ORA-12899 오류 발생 -- DEL_YN 컬럼의 DATETYPE이 VARCHAR2(1 BYTE) 라고 가정함 INSERT ..
ORA-01400 : NULL을 (~) 안에 삽입할 수 없습니다 해당 오류는 INSERT 구문을 작성하다 보면 확인할 수 있다. 오류 메시지에 친절하게 NULL을 '테이블.컬럼명' 에 삽입할 수 없다고 하는데, 풀어서 얘기하면 ORA-01400 오류는 테이블에 NULLABLE이 'No'인 컬럼이 있는데 해당 컬럼에 데이터를 넣지 않고 INSERT를 시도하는 경우 발생한다. -- INSERT 과정에서 ORA-01400 오류 발생 -- 해당 테이블의 USER_NO 컬럼은 NULLABLE 값이 'No' 라고 가정한다. INSERT INTO TB_USER ( USER_NM ) VALUES ( '김헌일' ) 위의 쿼리문은 겉으로 봐서는 문제가 없어 보이지만, USER_NO 컬럼의 NULLABLE 값이 No일 경우..
ORA-00913 : 값의 수가 너무 많습니다 "too many values" 데이터 확인을 위해 SQL 질의문을 작성하다 보면 가끔씩 마주치는 오류이다. + 해당 오류는 INSERT 과정에서도 발생한다. -- SELECT 과정에서 ORA-00913 오류 발생 SELECT * FROM TB_USER WHERE USER_NO = ( SELECT USER_NO, USER_NM FROM TB_USER WHERE USER_NO = ? ) -------------------------- -- INSERT 과정에서 ORA-00913 오류 발생 INSERT INTO TB_USER ( USER_NO, USER_NM ) VALUES ( 'ID000001', '김헌일', 'kimheonil' ) 해당 오류가 나는 이유는 ..
ORA-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다. "single-row subquery returns more than one row" 데이터 확인을 위해 SQL 질의문을 작성하다 보면 가끔씩 마주치는 오류이다. -- ORA-01427 오류 발생 SELECT * FROM TB_USER WHERE USER_NO = ( SELECT USER_NO FROM TB_USER ) 조건문에 들어간 서브쿼리가 하나 이상의 결과값을 뱉어내면 위와 같은 오류 메시지가 출력되는데 해결 방법은 간단하다. 1. equlas(=) 로 검색하려는 조건을 'IN'으로 수정하기 2. 하나의 결과만 정확하게 출력할 수 있도록 서브쿼리 수정하기 아래는 예시이다! -- 1번 SELECT * FROM TB_USER ..
-- 테이블 정보 SELECT * FROM ALL_TABLES WHERE TABLE_NAME = 'TABLE_NAME'; -- 테이블 코멘트 SELECT * FROM ALL_TAB_COMMENTS WHERE TABLE_NAME = 'TABLE_NAME'; -- 테이블 인덱스 정보 SELECT * FROM ALL_TABLES WHERE TABLE_NAME = 'TABLE_NAME'; -- 컬럼 코멘트 전체 조회 SELECT * FROM ALL_COL_COMMENTS WHERE TABLE_NAME = 'TABLE_NAME'; -- 컬럼 정보 조회 SELECT * FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = 'TABLE_NAME'; 아아~주 요긴하게 사용할 수 있는 쿼리입니다. 일일..
JDBC, Java DataBase Connectivity 자바에서 데이터베이스에 접속/관리할 수 있게 해주는 드라이버(API) 자바로 작성된 프로그램으로 DB와 관련된 작업을 처리할 수 있도록 제공되는 기능(코드)들을 모아놓은 것 OJDBC - Oracle 에서 제공하는 오라클 DB를 관리할 수 있도록 도와주는 JDBC이다. OJDBC & Oracle 버전 OJDBC6 - JDK 6 이상 - 오라클 11gR2 -- 나는 이것을 사용한다. OJDBC5 - JDK 5 이상 OJDBC14 - JDK 1.4 이상 OJDBC13 - JDK 1.3 이상 OJDBC12 - JDK 1.2 이상 자바 프로젝트에 OJDBC 설치하기(적용하기) Dynamic Web Project에서 ojdbc6.jar 를 복사하여 추가한..
VIEW 복잡한 쿼리를 간단하게 표현하려는 목적을 가지고 있다. 접근 할 수 있는 데이터의 범위(컬럼)를 축소시키는 용도로 사용할 때도 있다. 테이블에서 조회되는 컬럼을 제한할 수 있다. 조회결과를 저장하지 않는다, VIEW 는 SELECT 쿼리 (Sub Query)를 텍스트로 저장하고 있다. VIEW 는 이름만 봐서는 TABLE 인지 VIEW 인지 구분할 수 없다. 자료사전들은 대부분 VIEW 이다. VIEW 를 통해서 원본 테이블에 조회, 삽입, 수정, 삭제가 가능하다. 뷰 생성 구문 CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW VIEWNAME AS () [WITH CHECK OPTION] ; CREATE VIEW viewname AS ( 서브 쿼리 작성 ) 뷰만 생성..
Sequence 연속적인 숫자를 생성하는 객체 정수값으로 생성한다 생성된 숫자는 테이블의 행을 구분하는 PRIMARY KEY로 사용된다. 테이블 내에서 유일한 숫자를 자동으로 생성(Auto INCREMENT) 테이블마다 적용할 시퀀스를 각각 따로 생성해서 관리한다 (테이블이 5개면 시퀀스도 5개) 시퀀스 생성 구문 CREATE SEQUENCE 시퀀스명; 1부터 시작해서 1++ 시퀀스 변경 Option START WITH n 시작 값을 설정 할 수 있다. INCREMENT BY n 증가 값을 설정 할 수 있다 MAXVALUE n | NOMAXVALUE 최대값을 지정한다 MINVALUE n | NOMINVALUE 최소값을 지정한다 CYCLE | NOCYCLE 순환구조 여부를 지정한다 CACHE n | NOC..
DROP TABLE DROP TABLE TABLENAME DDL ROLLBACK 이 불가능하다 '테이블 자체'를 삭제한다 TRUNCATE TABLE TABLENAME DDL ROLLBACK 이 불가능하다 '테이블의 데이터'를 삭제한다 테이블의 스키마를 유지한다 DELETE TABLE TABLENAME DML ROLLBACK 이 가능하다 테이블의 데이터를 삭제한다 TRUNCATE 와 DELETE의 차이점 -- TRUNCATE DELETE -- DDL DML -- 데이터가 차지하던 물리적 공간 삭제 데이터가 차지하던 공간을 빈 공간으로 만듬. -- (용량이 줄어든다) (용량이 유지된다) -- 일반적인 데이터 삭제에는 DELETE를 사용하고 -- 테이블 전체 데이터를 초기화(삭제)..
헌일