본문 바로가기

오라클14

ORA-01461 Long 열에 입력할때만 Long 값을 바인딩 할 수 있다. Oracle 데이터베이스 입력 쿼리에서 "ORA-01461: can bind a LONG value only for insert into a LONG column" 에러가 발생하였습니다. 테이블에 Long 타입의 열은 없었습니다. 원인은 VARCHAR2(4000) 열에 열의 크기를 초과하는 값을 넣어려고 해서 발생한 것이었습니다. 해결 방법은 더 큰 데이터를 입력해야 하므로 CLOB 타입으로 변경하여 처리했습니다. 오라클에서 VARCHAR2 타입의 컬럼을 CLOB 타입으로 바꾸는 방법은 "Oracle에서 VARCHAR2 컬럼을 CLOB으로 변경하기"을 참조하세요. 그외에 발생가능한 상황으로는 PL/SQL 에서 함수에 4,000바이트 이상의 값을 가진 변수를 사용하려고 할 경우입니다. CREATE TABL.. 2018. 8. 21.
Oracle 원하는 기간의 날짜 데이터 만들기 일자별로 일정을 저장하는 테이블을 가정해봅시다. 일정이 있는 날의 데이터만 저장되어 있습니다. 이제 이 데이터를 달력이나 일주일씩 화면에 표시하는 방법을 생각해 보겠습니다. 두 가지 방법이 있을 수 있겠습니다. 첫 번째는 데이터베이스에서 원하는 월 또는 주 기간의 데이터를 조회합니다. 프로그램으로 기간 동안의 날짜 데이터 리스트를 만듭니다. 리스트를 루핑하면서 그 날짜에 데이터베이스에서 조회한 데이터가 있는지 다시 루핑하면 체크하여 데이터가 있으면 출력합니다. 두 번째는 데이터베이스에서 데이터를 만들때 원하는 기간의 날짜를 모두 만든 다음에 일정 테이블에 조인하여 결과를 만드는 것입니다. 일정이 있는날과 일정이 없는날 모두 데이터가 만들어지고 프로그램에서는 루핑하면서 출력하면 됩니다. 두 번째 방법을 사.. 2018. 7. 14.
오라클 MERGE INTO 문으로 있으면 UPDATE 없으면 INSERT 한번에 수행하기 테이블에 데이터가 이미 존재하면 업데이트 하고, 존재하지 않으면 입력을 해야 하는 경우가 종종 있습니다. 오라클에서 이런 작업을 한번에 할 수 있는 쿼리가 MERGE INTO 문 입니다. 현실적인 예는 아니지만 간단하게 성적 테이블을 생각해 보겠습니다. 과정코드과 학생코드가 주키이고, 성적 필드를 가지고 있습니다. CREATE TABLE TB_SCORE ( COURSE_ID VARCHAR2(10) NOT NULL, STUDENT_ID VARCHAR2(10) NOT NULL, SCORE NUMBER(5, 2) NULL, CONSTRAINT PK_SCORE PRIMARY KEY (COURSE_ID, STUDENT_ID) ); 1. 동일한 테이블 구조를 가지고 있는 TMP_SCORE 테이블로부터 데이터를 옮기.. 2018. 4. 20.
오라클 문자열에서 숫자만 남기고 다른 문자 제거하기 오라클 데이터베이스에서 전화 번호와 같은 값에서 숫자만 남기고 ), - 등의 다른 문자는 제거하는 방법을 알아 봅니다. 1. 정규식을 사용하는 방법 REGEXP_REPLACE(source_char, pattern) 함수를 사용하는 방법 입니다. -- 전화번호에서 숫자외의 문자를 제거합니다.SELECT REGEXP_REPLACE('010-1234-5678', '[^0-9]+') FROM DUAL; -- 숫자를 자리수로 끊어서 분리합니다.SELECT REGEXP_REPLACE('01012345678','([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})','\1-\2-\3') FROM DUAL; 2. TRANSLATE(expr, from_string, to_stri.. 2018. 4. 20.
오라클 데이터베이스 링크 생성하기 오라클 데이터베이스는 서버들끼리 데이터베이스 링크를 만들어 하나의 데이터베이스 처럼 사용하는 것이 가능합니다. 데이터베이스 링크에는 모든 사용자가 사용할 수있는 PUBLIC 데이터베이스 링크와 링크를 만든 계정에서만 사용할 수 있는 PRIVATE 링크가 있습니다. 데이터베이스 링크를 만들고 사용하는 방법을 알아보겠습니다. 1. 데이터베이스 링크 생성 권한 SYSTEM 계정으로 로그인하여 권한을 줍니다. -- TESTDBADM 계정이 PRIVATE 데이터베이스 링크를 만들 수 있게 권한을 줌. -- PRIVATE 링크는 CREATE 권한만으로 생성과 삭제를 할 수 있습니다. GRANT CREATE DATABASE LINK TO TESTDBADM; -- TESTDBADM 계정이 PUBLIC 데이터베이스 링크.. 2018. 4. 20.
Oracle 테이블 및 프로시저 생성 스크립트 추출하기 데이터베이스를 다루는데 있어서 가끔 GUI 툴을 쓸 수 없는 경우가 있습니다. 또한 프로시저 같은 경우 아주 큰 용량의 경우 exp 를 통해서 덤프를 받은 파일로 복구를 할 때 제대로 생성이 안되는 경우도 있습니다. 이렇게 좋지 않은 환경이 겹칠 경우 부득이하게 SQL*Plus를 사용해서 필요한 곳을 부분적으로 덤프 하게 됩니다. 테이블이나 프로시저의 생성 스크립트를 추출하기 위해서 DBMS_METADATA 패키지의 GET_DDL 함수를 사용할 수 있습니다. 1. 생성 스크립트 확인 - 테이블명이 'TB_BOARD' 인 테이블의 생성 스크립트를 확인합니다. SELECT DBMS_METADATA.GET_DDL('TABLE','TB_BOARD') FROM DUAL; - 인덱스의 이름이 'IX_BOARD' 인.. 2018. 4. 20.
Oracle Sequence 만들기 (일련번호 생성하기) 데이터베이스에서 일련번호를 생성하는 것은 동시성 문제가 발생할 수 있어 간단한 작업이 아닙니다. 그래서 대부분의 데이터베이스에서는 일련번호 생성을 간단히 처리할 수 있는 기능들을 제공해 주고 있습니다. MS-SQL 서버에서는 컬럼에 identify 속성을 지정할 수 있고, MySQL 에서는 컬럼에 auto_increment 속성을 지정할 수 있습니다. Oracle에서는 테이블 속성으로 제공하지 않고 별도의 Sequence 객체를 생성해서 이용할 수 있습니다. 이러한 데이터베이스에서 제공하는 기능을 사용하면 동시성 문제에 신경을 쓰지 않고 간단히 처리할 수 있지만, 하나의 데이터베이스에 종속되는 단점도 있습니다. 오라클에서는 일련번호를 생성할 수 있는 Sequece 사용법을 알아보겠습니다. 1. 시퀀스 생.. 2018. 4. 20.
Oracle에서 테이블 복사하기 테이블 구조를 수정하거나 데이터의 조정이 필요해서 원본 테이블을 복사하여 작업하는 경우가 가끔 있습니다. 이럴 경우 사용할 수 있는 방법을 알아보겠습니다. 1. 임시 테이블 생성과 동시에 복사하기 TB_BOARD 라는 이름의 테이블을 TB_BOARD_TMP 라는 동일한 구조의 테이블을 만들고 데이터를 복사하는 방법입니다. CREATE TABLE TB_BOARD_TMP AS SELECT * FROM TB_BOARD; 이 명령으로 임시 테이블의 생성과 데이터의 복사를 동시에 할 수 있습니다. 이 때 키와 인덱스는 생성되어지지 않습니다. 필요하다면 별도로 생성하여야 합니다. 2. 임시 테이블을 따로 만들고 데이터를 복사하는 방법입니다. 2-1. 테이블 구조가 동일할 때 INSERT INTO TB_BOARD_T.. 2018. 4. 20.
Oracle 두 날짜 사이의 일수 차이 와 분 차이 구하기 오라클에서 두 날짜 사이의 차이 일수를 구하는 방법은 간단합니다. 단순히 두 날짜를 빼주면 되겠습니다. 이때 주의할 점은 날짜 빼기를 하면 시간 부분도 계산이 되기 때문에 소숫점 숫자가 됩니다. SELECT SYSDATE - TO_DATE('20171110', 'YYYYMMDD') FROM DUAL; 결과)11.96041666666666666666666666666666666667 TO_DATE('20171110', 'YYYYMMDD') 부분은 시간 부분이 모두 0 이지만 SYSDATE 는 시간 부분이 있기 때문에 소수점 숫자가 나오게 됩니다. 단순히 날짜의 차이만을 구하기 위해서는 시간부분을 모두 0으로 처리해야 합니다. 다음과 같이 할 수 있습니다. SELECT TRUNC(SYSDATE) - TO_DA.. 2018. 4. 20.
Oracle 툴에서 & 입력 또는 조회하기 Oracle 툴인 SQLPlus 나 SQL Developer에서 쿼리중에 & 와 같은 특수 문자를 사용하면 툴 자체의 기능으로 인식되어 처리가 되지 않습니다. INSERT TB_TEST INTO (1, '김&이');-- orSELECT * FROM TB_TEST WHERE NAME = '김&이'; 이때 다음 명령을 먼저 내린후 쿼리를 실행합니다. SET DEFINE OFF 이러한 상황은 SQL Plus나 SQL Developer등의 툴에서 발생합니다. 프로그래밍으로 쿼리를 실행하는데는 문제가 없습니다. 2018. 4. 20.
오라클 ALTER 명령을 사용해서 테이블 변경하기 ALTER 명령어를 사용해서 오라클 테이블 구조를 변경하는 방법에 대해 알아봅니다. 1. 테스트용 테이블 생성 스크립트 입니다. CREATE TABLE TB_BOARD ( NUM NUMBER(20,0) NOT NULL, NAME VARCHAR2(20) NOT NULL, TITLE VARCHAR2(100) NOT NULL, CONTENT CLOB, D_CODE VARCHAR(20), READ_COUNT NUMBER(10,0) DEFAULT 0 NOT NULL, WRITE_DATE DATE NOT NULL ); CREATE TABLE TB_DEPT ( D_CODE VARCHAR2(20) NOT NULL, D_NAME VARCHAR2(255) NOT NULL ); -- TABLESPACE 사용 CREATE T.. 2018. 4. 9.
오라클 계층 쿼리(Hierarchical Query)의 사용법 업무를 데이터베이스로 구현을 하다보면 한 테이블 내의 데이터가 계층적 관계를 가지는 경우가 많이 있습니다. 예를 들어보면 코드정보, 부서정보, 사이트의 메뉴 정보 등이 되겠습니다. 계층의 단계가 고정 되어 있고, 두 계층 정도라면 테이블을 분리할 수도 있지만, 임의의 단계를 표현해야 한다면 한 테이블에 상위 데이터로의 연결고리를 가지도록 구현을 하게 됩니다. 제품의 BOM(Bill of Material - 부품의 계층 정보) 정보 같은 것이 되겠습니다. 이러한 자기참조 구조는 이해하기도 편하고, 깔끔하게 구현이 됩니다. 하지만 한가지 중대한 단점이 있습니다. 관계 데이터베이스는 한 행내의 데이터들 간의 연산은 아주 간단히 처리되지만, 다른 행과 관계되는 연산은 쿼리가 상당히 복잡해 집니다. 복잡한 서브쿼.. 2018. 4. 9.
스프링 프레임웍에서 MyBatis, Oracle 사용하기 Spring4 + MyBatis + Oracle 을 연동해 봅니다. 앞에서 만들었던 샘플 프로젝트 ( "Spring MVC 샘플 프로젝트 버전3 에서 버전 4로 마이그레이션 하기" ) 를 사용합니다. 1. 먼저 설치한 Oracle 데이터베이스에 유저를 추가하고 테스트용 테이블 을 생성합니다. SYSTEM 계정으로 들어가서 다음 명령으로 사용자를 추가합니다. 아이디와 비밀번호는 xeuser 입니다. GRANT CONNECT, RESOURCE TO xeuser IDENTIFIED BY xeuser; SQL Developer 에서 명령 실행은 실행하고자 하는 쿼리를 블럭으로 선택한 후 F9 또는 Ctrl+Enter 입니다. 이제 생성된 계정으로 들어가서 테스트용 테이블을 생성합니다. CREATE TABLE T.. 2018. 4. 1.
Oracle 11g Express Edition 과 SQL Developer 설치하기 웹프로그래밍에 데이터베이스가 빠질 수 없겠죠. Oracle 11g Express Edition 과 SQL Developer 를 설치해 보겠습니다. 둘다 www.oracle.com 에서 다운 받을 수 있습니다. 다운로드 할 때 라이센스에 동의하고 다운로드 링크를 클릭하면 로그인 하라고 나옵니다. OTN 에 가입해야 합니다. 다운받을 파일은 OracleXE112_Win64.zip 과 sqldeveloper-4.1.5.21.78-no-jre.zip 입니다. JDK 는 이미 설치 했다고 가정하고, sqldeveloper 는 no-jre 로 받습니다. ( JDK 설치는 윈도우에 JDK 8 설치하기 를 참조 하세요. ) Express Editon 은 개발, 프로토타입, 내부 데이터 처리용 으로 사용 가능합니다. 또.. 2018. 4. 1.