본문 바로가기

프로그래밍/데이터베이스33

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.
MySQL(MariaDB) 서버 타임존 설정하기 Java에서 MySQL 서버에 연결하니 다음과 같은 에러가 발생하였습니다. ### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Cannot create PoolableConnectionFactory (The server time zone value xxxxx is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone conf.. 2018. 7. 17.
Oracle 원하는 기간의 날짜 데이터 만들기 일자별로 일정을 저장하는 테이블을 가정해봅시다. 일정이 있는 날의 데이터만 저장되어 있습니다. 이제 이 데이터를 달력이나 일주일씩 화면에 표시하는 방법을 생각해 보겠습니다. 두 가지 방법이 있을 수 있겠습니다. 첫 번째는 데이터베이스에서 원하는 월 또는 주 기간의 데이터를 조회합니다. 프로그램으로 기간 동안의 날짜 데이터 리스트를 만듭니다. 리스트를 루핑하면서 그 날짜에 데이터베이스에서 조회한 데이터가 있는지 다시 루핑하면 체크하여 데이터가 있으면 출력합니다. 두 번째는 데이터베이스에서 데이터를 만들때 원하는 기간의 날짜를 모두 만든 다음에 일정 테이블에 조인하여 결과를 만드는 것입니다. 일정이 있는날과 일정이 없는날 모두 데이터가 만들어지고 프로그램에서는 루핑하면서 출력하면 됩니다. 두 번째 방법을 사.. 2018. 7. 14.
오라클 에러 ORA-00984: 열을 사용할 수 없습니다 쿼리 도중 "ORA-00984: 열을 사용할 수 없습니다" 라는 에러를 만났습니다. 입력문을 실행 도중 발생한 에러 입니다. 쿼리를 추출해서 sqldeveloper에서 실행해 보았습니다. 명령의 1 행에서 시작하는 중 오류 발생 - INSERT ... VALUES (...,SYDATE) 오류 발생 명령행: 1 열: 323 오류 보고 - SQL 오류: ORA-00984: 열을 사용할 수 없습니다 00984. 00000 - "column not allowed here" *Cause: *Action: 원래 에러메세지들은 친절하지 않지만 번역된 에러 메세지로 이해가 힘들었던것 같습니다. "열을 사용할 수 없습니다"의 원문은 "column not allowed here" 입니다. "열이 여기에 올 수 없습니다" .. 2018. 7. 12.
Oracle Open 백업 하기(Hot backup) Oracle 백업은 닫힌 백업(Close Backup)과 열린 백업(Open Backup) 으로 나눌 수 있습니다. 닫힌 백업은 Oracle 데이터베이스를 완전히 종료한후 필요한 파일을 백업하는 방법입니다. 열린 백업은 데이터베이스가 실행중에 백업을 할 수 있는 방법 입니다. 여기에서는 Oracle의 열린 백업을 하는 방법을 알아보겠습니다. 환경은 Windows에서 Oracle XE 11g 로 테스트 하였습니다. 일단 열린 백업을 하기 위해서는 데이터베이스가 아카이브 모드로 동작하고 있어야 합니다. 아카이브 모드로 설정하는 것은 "Oracle Archive Mode 설정하기" 를 참조하세요. 1. 백업 대상이 되는 파일- 데이터 파일 : 실제 데이터가 저장되는 파일 입니다.- 컨트롤 파일 : 데이터베이스.. 2018. 4. 21.
Oracle Archive Mode 설정하기 Oracle은 데이터 복구를 위해 데이터베이스에 대한 모든 변경사항을 redo 로그 파일에 적어둡니다. redo 로그 파일에 변경정보를 적어서 보관하는데, 두 가지 방법을 사용할 수 있습니다. 아카이브 로그 모드(Archive Log Mode)와 노 아카이브 로그 모드(No Archive Log Mode)입니다. 노 아카이브 로그 모드는 오라클 설치시 기본 설정으로 몇 개의 redo 로그 파일을 돌려 쓰는 방식입니다. 즉, 일정 갯수의 파일에 저장된 정보 외에 이전 정보는 사라지게 됩니다. 아카이브 로그 모드는 redo로그 파일을 모두 사용하여 처음 파일에 덮어쓰기전에 이전 파일을 다른 곳에 복사해 두는 방식입니다. 그러므로 모든 로그 정보가 보존됩니다. 현재 데이터베이스의 로그 모드를 확인해 보고, 변.. 2018. 4. 21.
Windows용 MySQL 백업 배치 파일 만들기 Windows에서 MySQL 데이터베이스를 mysqldump 명령으로 백업하고, 오래된 백업 파일을 삭제하는 배치 프로그램을 만들어 봅니다. @ECHO OFFECHO MySQL 데이터베이스 백업 시작 FOR /F "tokens=1-3 delims=- " %%a IN ('DATE /T') DO (SET dt=%%a-%%b-%%c)FOR /F "tokens=1-4 delims=:." %%a IN ('ECHO %TIME%') DO (SET tm=%%a%%b%%c%%d)SET backupfilename=_%dt%_%tm%.sqlECHO 백업파일명: %backupfilename% mysqldump --routines -uusername -ppassword dbname > E:\data\backup\"dbname%.. 2018. 4. 20.
오라클 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.