728x90
반응형
LIST

Oracle DB 10g부터 최신 버전까지의 차이점과 특징 총정리 🚀

Oracle Database는 지속적으로 발전해오며, 기업 데이터 관리의 중심에 자리 잡고 있습니다. 10g부터 최신 버전인 21c까지, 각 버전은 데이터베이스 성능, 보안, 자동화, 클라우드 지원 등 다양한 측면에서 혁신을 이루어 왔습니다. 이번 포스팅에서는 Oracle DB 10g부터 최신 버전까지의 주요 차이점과 특징을 비교해보겠습니다.

1. Oracle 10g (2003) – Grid Computing의 시작 🌐

Oracle 10g는 "g"가 의미하듯이 Grid Computing 기술이 도입된 첫 버전입니다. 분산 환경에서 여러 서버를 하나의 시스템처럼 작동시켜 자원을 효율적으로 관리할 수 있게 되었죠.

주요 특징:

  • Grid Infrastructure 도입으로 자원 관리 자동화
  • 데이터베이스 자동 튜닝 (Automatic Database Diagnostic Monitor, ADDM)
  • 플래시백 데이터베이스 기능 도입으로 데이터 복구 용이
  • SQL Model 기능 추가로 분석 성능 향상
  • EM(Enterprise Manager) 개선으로 직관적인 GUI 환경 제공

2. Oracle 11g (2007) – 자동화와 보안 강화 🔐

Oracle 11g에서는 자동화와 보안 강화에 초점을 맞췄습니다. 더욱 강력한 데이터 복구와 보안 기능이 추가되었으며, 데이터베이스 관리가 쉬워졌습니다.

주요 특징:

  • Automatic SQL Tuning으로 성능 최적화 자동화
  • Data Recovery Advisor로 장애 발생 시 자동 복구 제안
  • 보안 강화 (Transparent Data Encryption 개선)
  • Virtual Column 기능으로 유연성 향상
  • Real Application Testing으로 변경 사항에 대한 사전 테스트 가능

3. Oracle 12c (2013) – 멀티 테넌트 아키텍처 도입 🏢

Oracle 12c는 클라우드 환경을 고려한 Multitenant 아키텍처를 도입하여 여러 데이터베이스를 하나의 컨테이너에 수용하는 개념을 도입했습니다.

주요 특징:

  • Multitenant Database(PDB, CDB) 개념 도입
  • 자동 데이터 최적화 (Automatic Data Optimization)
  • In-Memory 옵션으로 실시간 데이터 분석 성능 강화
  • JSON 지원으로 NoSQL 기능 통합
  • Oracle Database Sharding으로 데이터 분산 처리

4. Oracle 18c (2018) – 자율운영 데이터베이스 시작 🤖

Oracle 18c는 클라우드 중심의 변화가 이루어진 버전으로, 자율운영 데이터베이스 개념이 본격적으로 도입되었습니다.

주요 특징:

  • Autonomous Database 서비스 (Autonomous Data Warehouse, Autonomous Transaction Processing)
  • Real Application Cluster (RAC) 개선
  • Machine Learning 기반 자율 튜닝
  • JSON 데이터의 처리 및 관리 기능 강화
  • Oracle Cloud Platform 통합

5. Oracle 19c (2019) – 안정성과 장기 지원 🔄

Oracle 19c는 장기 지원(LTS, Long Term Support) 버전으로, 안정성과 성능 개선에 중점을 두었습니다.

주요 특징:

  • 자동 인덱스 생성 (Automatic Indexing)
  • 향상된 JSON, Graph 데이터 처리
  • 데이터베이스 복구 성능 강화
  • Exadata에서 In-Memory 성능 향상
  • Hybrid Partitioned Table 기능 도입

6. Oracle 21c (2021) – 혁신과 확장성 🚀

Oracle 21c는 최신 버전으로, 개발자 친화적인 새로운 기능들이 다수 추가되었습니다.

주요 특징:

  • Blockchain Table 도입으로 데이터 무결성 보장
  • JSON Duality View로 SQL과 JSON 간 상호운용성 강화
  • In-Memory 기능 확장
  • AutoML, Graph 알고리즘 내장
  • JavaScript Stored Procedure 지원

7. 버전별 주요 차이점 비교 표 📊

버전 출시 연도 주요 특징 키워드
10g 2003 Grid Computing, Flashback DB 분산 컴퓨팅, 데이터 복구
11g 2007 자동 SQL 튜닝, 보안 강화 자동화, 보안
12c 2013 멀티 테넌트, In-Memory 옵션 클라우드, 다중 DB 관리
18c 2018 자율운영 DB, 머신러닝 기반 튜닝 자율운영, 클라우드
19c 2019 자동 인덱스, 장기 지원 안정성, LTS
21c 2021 Blockchain, JSON Duality 확장성, 블록체인

8. 결론 및 향후 전망 🌱

Oracle Database는 데이터베이스 기술의 선두주자로서 기업의 다양한 요구를 충족시키기 위해 지속적으로 진화해 왔습니다. 특히 자율운영 데이터베이스와 클라우드 통합은 앞으로의 데이터 관리 환경에서 중요한 역할을 하게 될 것입니다.

💡 독자들에게:

  • Oracle Database를 도입하거나 업그레이드할 계획이 있다면 각 버전의 주요 특징을 파악하고, 비즈니스 요구에 맞는 기능을 활용해보세요!
  • 클라우드 전환을 고려 중이라면 Oracle 18c 이후 버전을 적극 검토하는 것이 좋습니다.

9. Q&A 섹션 ❓

Q1. Oracle 19c와 21c 중 어떤 버전을 선택해야 하나요?

  • Oracle 19c는 장기 지원 버전(LTS)으로 안정성이 요구되는 환경에 적합합니다. 반면, 21c는 최신 기능을 필요로 하는 개발 환경에 적합합니다.

Q2. Autonomous Database는 무엇인가요?

  • 자율운영 데이터베이스로, 머신러닝을 기반으로 데이터베이스 튜닝, 보안, 복구 등을 자동으로 수행하는 기술입니다.

Q3. Oracle Database 12c에서 PDB와 CDB의 차이는 무엇인가요?

  • PDB(Pluggable Database)는 독립적인 데이터베이스이고, CDB(Container Database)는 여러 PDB를 담고 관리하는 컨테이너 역할을 합니다.

Q4. JSON 데이터를 Oracle DB에서 다룰 수 있나요?

  • 네, Oracle 12c 이후부터 JSON 데이터 처리가 가능하며, 21c에서는 JSON과 SQL 간의 상호 운용성이 더욱 강화되었습니다.
728x90
반응형
LIST
728x90
반응형
LIST

최근 로그인 시 패스워드를 잘못 입력하여 로그인이 제한되는 경우가 발생하고 있습니다. 이는 보안을 강화하기 위한 조치이지만, 실수로 패스워드를 잘못 입력하는 경우에도 로그인이 제한될 수 있어 불편함을 초래하고 있습니다.

따라서, 패스워드 실패 횟수 제한을 해제하는 방법을 안내드리겠습니다.

  1. 관리자 권한으로 SQL*Plus에 접속합니다.

  2. 다음 명령어를 실행합니다.

     ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED;
    
  3. 해당 명령어를 실행하면 패스워드 실패 횟수 제한이 해제됩니다.

위의 방법으로 패스워드 실패 횟수 제한을 해제하실 수 있습니다.

하지만, 보안을 위해 패스워드를 정기적으로 변경하시는 것을 권장드립니다.

728x90
반응형
LIST
728x90
반응형
LIST

Oracle은 데이터베이스 관리 시스템(DBMS)의 일종으로, 대규모 응용 프로그램에서 많이 사용됩니다. Oracle 구조는 다음과 같습니다.

인스턴스

인스턴스는 Oracle DBMS의 핵심 요소 중 하나입니다. 인스턴스는 데이터베이스에 액세스할 수 있는 프로세스와 메모리 집합입니다. 인스턴스는 데이터베이스를 관리하고 모든 작업을 처리합니다. 인스턴스는 SGA(System Global Area)와 후속 데이터베이스 인스턴스 프로세스를 구성합니다. SGA는 데이터베이스 메모리 구조 중 가장 중요한 구성 요소 중 하나입니다. SGA는 세션, 프로세스 및 SQL 문장과 같은 데이터베이스 작업을 처리하는 데 사용됩니다.

데이터베이스

데이터베이스는 Oracle 인스턴스에서 관리하는 데이터의 집합입니다. 데이터베이스는 데이터 파일 및 제어 파일로 구성됩니다. 데이터 파일은 실제 데이터를 저장하는 데 사용되며, 제어 파일은 데이터베이스의 메타데이터 및 제어 정보를 저장합니다. 데이터베이스는 논리적인 데이터 저장소입니다. 데이터베이스 객체(entity)는 테이블, 뷰, 인덱스, 시퀀스 등이 있으며, 이러한 객체는 데이터베이스의 구성 요소입니다.

테이블스페이스

테이블스페이스는 데이터베이스에서 데이터를 저장하는 논리적인 구조입니다. 테이블스페이스는 한 개 이상의 데이터 파일로 구성됩니다. 각 테이블스페이스는 데이터베이스의 특정 데이터 유형을 저장합니다. 테이블스페이스를 사용하여 데이터를 논리적으로 구성하면 데이터베이스의 성능을 최적화할 수 있습니다.

세그먼트

세그먼트는 테이블스페이스 내에서 논리적인 데이터 저장 단위입니다. 세그먼트는 테이블, 인덱스, 로브 및 파티션과 같은 객체에 할당됩니다. 각 세그먼트는 하나의 객체(테이블 또는 인덱스)에 대한 것입니다. 세그먼트는 익스텐트로 구성됩니다.

익스텐트

익스텐트는 데이터 파일 내에서 논리적인 데이터 저장 단위입니다. 익스텐트는 세그먼트에 할당되며, 하나 이상의 데이터 블록으로 구성됩니다. 익스텐트는 데이터 파일에 할당되며, 데이터 파일은 하나 이상의 익스텐트로 구성됩니다.

Oracle 구조는 다양한 구성 요소로 구성되어 있으며, 이러한 구성 요소는 Oracle DBMS의 기능 및 성능에 영향을 미칩니다. Oracle DBMS를 사용하면 대량의 데이터를 저장하고 관리할 수 있으며, 성능과 안정성을 유지할 수 있습니다.

728x90
반응형
LIST
728x90
반응형
LIST

Oracle은 관계형 데이터베이스 관리 시스템(RDBMS)입니다. 이 데이터베이스는 대규모 데이터베이스를 효율적으로 관리할 수 있는 강력한 기능과 도구를 제공합니다. 이러한 기능과 도구는 데이터베이스가 더욱 튼튼해지고 안정적으로 유지되도록 도와줍니다. 또한, Oracle은 데이터베이스의 확장성과 유연성을 보장하며, 다양한 운영체제와 호환되어 클라우드 환경에서도 사용할 수 있습니다.

 

Oracle 데이터베이스는 여러 사용자가 동시에 접근하여 데이터를 공유할 수 있도록 설계되어 있습니다. 이것은 다수의 사용자가 데이터베이스에 접근하고 조작할 수 있도록 하며, 데이터의 무결성과 보안을 위한 다양한 기능도 제공합니다. 이러한 기능은 데이터베이스가 안정적으로 유지되도록 하며, 사용자가 데이터를 쉽게 관리할 수 있도록 돕습니다. 또한, Oracle 데이터베이스는 대규모 데이터를 처리하고 복잡한 데이터베이스 로직을 구현할 수 있는 SQL(Structured Query Language)과 PL/SQL(Procedural Language/Structured Query Language)을 지원합니다. 이러한 기능은 데이터베이스를 보다 쉽게 관리할 수 있도록 돕습니다.

 

Oracle은 전세계 대규모 기업에서 많이 사용되며, 데이터베이스 관리자나 개발자에게 매우 중요한 기술입니다. Oracle 데이터베이스를 다루는 기술은 데이터 관리 및 유지보수, 신뢰성 및 보안, 데이터베이스 설계 및 개발 등 다양한 분야에서 필수적으로 사용됩니다. Oracle 기술을 습득하면 더욱 효율적이고 안정적인 데이터베이스 관리 및 개발을 할 수 있으며, 이는 다양한 기업에서 경력 개발을 위한 좋은 기회를 제공합니다. 또한, Oracle은 많은 기업에서 사용하는 대표적인 데이터베이스 관리 시스템으로, 이를 다루는 기술은 전 세계적으로 인정받는 기술 중 하나입니다.

728x90
반응형
LIST
728x90
반응형
LIST

-- 여러가지 연산자들

 

between 1 and 10 -- 사이 값

sal IN(2, 3) -- 해당 레코드와 일치하는 것 

ename like '_S\%%' escape '\' -- 해당 문자가 포함된 레코드 검색

                                                %를 포함한 문자 검색시에 옵션 설정 가능

 

 

 

-- 숫자 관련 함수들

 

abs(-2) -- 절대값

mod(5,2) -- 나머지

sign(-2) -- 양, 음 판단

ceil(3.26) -- 소수점에서 올림

floor(3.26) -- 소수점에서 버림

round(3.26, 1) -- 해당 소수점에서 반올림

trunc(3.26, 1) -- 해당 소수점에서 버림

 

-- 문자 관련 함수들

upper/lower(ename) -- 대,소문자 변환

initcap(ename) -- 첫 글자만 대문자로 변환

concat(job,ename) -- 두 문자 값 연결

substr(ename, 1, 2) -- 해당 위치부터 지정된 만큼의 문자를 추출. -1위치는 뒤에서 추출

 

length(ename) -- 문자의 길이

ltrim/rtrim('abb ', 'a') -- 해당 방향에서 지정된 문자 제거

lpad/rpad('abb ', 5, 'a') -- 문자가 자리수를 만족하지 못한다면 해당 방향에서 지정된 문자로 채움

trim('S' from ename) -- 양쪽에서 지정된 문자열 제거

 

-- 날짜 관련 함수들

 

add_months(sysdate,2) -- 해당 날짜에 달수를 더함

months_between(sysdate, hiredate) -- 두 날짜의 차이

 

 

 

-- 형 변환 함수들

 

to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') -- 날짜형을 문자형으로 변환. 일반적인 형태

to_char(123456, 'L000,000,000') -- 숫자형을 문자형으로변환. 1의자리부터 맞추고 \형태로 0을 채움 

                                              0 대신 9로 채우면 알아서 잘라서 채움

to_number('5')-2 -- 문자형을 숫자형으로 변환

to_date(19810220, 'YYYYMMDD') -- 문자형을 날짜형으로 변환

 

 

-- 그 밖의 함수들

 

 

nvl(str, 'a') -- 해당 값이 NULL값이면 해당 지정된 문자 출력

 

-- NULL 값[정해지지 않은 값]을 넣는 세가지 방법

insert into emp(seq, str) values(2,NULL)

insert into emp(seq) values(2)

insert into emp(seq, str) values(2,'')

 

 

 

 

-- 조건 관련 함수

 

DECODE(to_char(hiredate, 'YYYY'),

'1980','과장',   '1981','대리',   '사원')

CASE to_char(hiredate, 'YYYY')

WHEN '1980' THEN '과장'   WHEN '1981' THEN '대리'   ELSE '사원'   END

-- CASE에서는 비교조건을 쓸 수 있음. NULL은 is NULL 형태로 기술

 

-- 그룹 함수

 

max(sal) -- 최소 값

min(sal) -- 최대 값

sum(sal) -- 합계

avg(sal) -- 평균

count(comm) -- NULL값을 제외한 개수

count(*) -- 총 개수

 

 

 

-- HAVING 절[그룹함수는 where절에 쓸 수 없기 때문에 씀(순서에 유의)]

select job, count(*)

from emp

where sal>500 and job !='PRESIDENT'

group by job -- select에 기술한 컬럼들은 반드시 group by절에 기술 되어 있어야 함

HAVING count(*)>2 -- 그룹의 결과를 제한할 때 쓰이며, 그룹함수를 적용한 컬럼이 조건으로 옴

order by job

 
 
728x90
반응형
LIST

'IT개발/정보 > DB ( Oracle )' 카테고리의 다른 글

Oracle 구조  (0) 2023.03.02
Oracle 개념  (0) 2023.03.02
테이블 스페이스 용량 자동 증가 및 추가하기  (0) 2021.12.26
ORACLE | 대형 데이터 관리 (LOB, BLOB, CLOB) with Java  (0) 2021.12.26
Object recompile  (0) 2021.12.26
728x90
반응형
LIST
OS : Windows Server2008
프로그램 및 버전 : Oracle11g

※ 주의사항 : 실제 적용을 위해서는 한번쯤 시험을 해보고 하시길...

1. 작업개요
   - 처음 테이블 스페이스를 생성할때 사이즈를 지정하고 데이터가 많아지다 보면 지정된 사이즈를 넘어서게 되고 그렇게 되면 DB가 멈춰 버린다. 이것을 방지하기위해 테이블스페이스 사이즈를 자동으로 증가할 수 있게 설정해줘야 하고, 만일 허용치(30G)가 넘어가려 한다면 데이터 파일을 새로 생성해줘야한다.

2. 작업내용
1) 테이블 스페이스 확인하기 : 현재 테이블스페이스의 총 사이즈와, 사용중인 사이즈, 남은 사이즈를 확인할 수 있음
SELECT A.TABLESPACE_NAME          TABLESPACE_NAME
            ,ROUND(A.BYTES,2)           TOT_SIZE
            ,ROUND((A.BYTES-B.BYTES),2) USE_SIZE
            ,ROUND(B.BYTES,2) FREE_SIZE
   FROM (SELECT B.TABLESPACE_NAME
                         ,SUM(B.BYTES)/1024/1024/1024 BYTES
                 FROM DBA_DATA_FILES B
               GROUP BY B.TABLESPACE_NAME
             ) A
            ,(SELECT A.TABLESPACE_NAME
                         ,SUM(A.BYTES)/1024/1024/1024 BYTES
                  FROM DBA_FREE_SPACE A
                 GROUP BY A.TABLESPACE_NAME
            ) B
WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME(+)
ORDER BY 1
- 하나의 데이터파일 당 최고 값이 30G이므로 만일 TOTAL사이즈가 30G가 되어간다면 참고1) 을 참고하여 데이터파일을 새로 생성해 줘야 한다.

2) 테이블 스페이스가 자동으로 증가되도록 설정되어 있는지 확인하기
SELECT FILE_NAME, AUTOEXTENSIBLE FROM DBA_DATA_FILES
- AUTOEXTENSIBLE : YES이면 자동 증가, NO 이면 자동증가 아님

3) 테이블스페이스 사이즈 자동 증가하도록 설정하기
ALTER DATABASE DATAFILE ['데이터파일경로 및 파일명'] AUTOEXTEND ON NEXT [사이즈];
- 선택한 데이터파일을 자동으로 설정한 사이즈 만큼 증가한다.
ALTER DATABASE DATAFILE ['데이터파일경로 및 파일명'] AUTOEXTEND ON MAXSIZE [사이즈];
- 선택한 데이터파일이 설정한 사이즈까지 증가한다.

ex) ALTER DATABASE DATAFILE 'D:\MYDB\MY_DATA.ORA' AUTOEXTEND ON NEXT 100M;
ex) ALTER DATABASE DATAFILE 'D:\MYDB\MY_DATA.ORA' AUTOEXTEND ON MAXSIZE 30000M;

참고1) 
ALTER TABLESPACE [테이블스페이스명] ADD DATAFILE ['데이터파일경로 및 파일명'] SIZE [사이즈];
ex) ALTER TABLESPACE MYDB ADD DATAFILE 'D:\MYDB\MY_DATA.ORA' SIZE 10G;

3. 작업결과

- 만일 테이블스페이스 사이즈가 30G에 도달하여 참고1 작업을 진행하였다면, 1) 을 다시 실행하여 정상적으로 증가됐는지 확인한다.

 

 

출처 : http://www.happytomorrow.net/107

728x90
반응형
LIST

'IT개발/정보 > DB ( Oracle )' 카테고리의 다른 글

Oracle 개념  (0) 2023.03.02
SQL문에 쓰이는 함수 및 연산자들  (0) 2021.12.26
ORACLE | 대형 데이터 관리 (LOB, BLOB, CLOB) with Java  (0) 2021.12.26
Object recompile  (0) 2021.12.26
Tablespace 생성, 삭제  (0) 2021.12.26
728x90
반응형
LIST

1. LOB

 

- LOB은 TEXT, 그래픽, 이미지, 비디오, 사운드 등 구조화되지 않은 대형 데이터를 저장하는데 사용한다.

- 일반적으로 테이블에 저장되는 구조화된 데이터들은 크기가 작지만, 멀티미디어 데이터는 크기가 크다.

- 크기가 큰 데이터는 DB에 저장하기 힘들기 때문에 OS상 존재하는 파일을 데이터베이스가 접근하게 된다.

- LONG, LONG RAW 데이터 유형은 예전에 사용던 것이고, 현재는 대부분 LOB 데이터 유형을 사용한다.

- TO_LOB 함수를 이용하여 LONG 및 LONG RAW 를 LOB 으로 변경할 수 있다.

 

 

종류

   - CLOB: 문자 대형 객체 (Character). Oracle Server는 CLOB과 VARCHAR2 사이에 암시적 변환을 수행한다.

   - BLOB: 이진 대형 객체 (Binary). 이미지, 동영상, MP3 등... 

   - NCLOB: 내셔널 문자 대형 객체 (National). 오라클에서 정의되는 National Character Set을 따르는 문자.

   - BFILE: OS에 저장되는 이진 파일의 이름과 위치를 저장. 읽기 전용 모드로만 액세스 가능.

 

 

데이터베이스 내부, 외부에 따라

   - 내부 : BLOB, CLOB, NCLOB - Table에 LOB 형식의 컬럼을 생성하고 이곳에 데이터의 실제위치를 가리키는 Locator(위치자) 저장.

   - 외부 : BFILE

 

특징- 하나의 테이블에 여러 개의 LOB 열(column) 가능- 최고 4GB까지 저장- SELECT로 위치자 반환- 순서대로 또는 순서없이 데이터 저장- 임의적 데이터 액세스 LOB 구성- LOB 값 : 저장될 실제 객체를 구성하는 데이터- LOB 위치자 : 데이터베이스에 저장된 LOB값의 위치에 대한 포인터
 
 

2. 내부 LOB

  

- LOB값은 데이터베이스에 저장된다.

- 사용자 정의 유형 속성, 테이블의 열, 바인드 변수, 호스트 변수, PL/SQL변수, 파라미터 또는 결과

- 동시성 방식, 리두 로그 및 복구 방식, 커밋또는 롤백 트랜잭션 사용 가능

- BLOB 데이터 유형은 Oracle Server 내에서 비트 스트림으로 해석된다.

- CLOB 데이터 유형은 단일 바이트 문자 스트림으로 해석된다.

- NCLOB 데이터 유형은 데이터베이스 national character set 의 바이트 길이에 따라 멀티바이트 문자 스트림으로 해석된다.

 

내부 LOB 관리

- LOB 데이터 유형을 포함하는 테이블을 생성한 후 이를 채운다.

- 프로그램에서 LOB 위치자를 선언하고 초기화한다.

- SELECT FOR UPDATE를 사용하여 LOB이 포함된 행을 잠그고 해당 행 값을 LOB 위치자에 넣는다.

- LOB 위치자를 LOB값에 대한 참조로 사용하여 DBMS_LOB 패키지 프로시저, OCI호출, OLE용 오라클 객체, 오라클 선행 컴파일러 또는 JDBC를 통해 LOB을 조작한다.

- SQL을 통해서도 LOB 관리 가능(일부)

- COMMIT을 통해 변경사항 적용.

 

 

3. CLOB

 

lob_test1.sql

 

 

CREATE TABLE CAR (
        id      NUMBER(6) PRIMARY KEY NOT NULL,
        name    VARCHAR2(20),
        price   NUMBER(10),
        review  CLOB)
/



INSERT INTO CAR VALUES (100, 'SM7', 25000000, '삼성에서 나온 SM7을 타보니 정말 편안했다.')
/
INSERT INTO CAR VALUES (200, 'PORTER', 13000000, '역시 1톤트럭의 대표자!!')
/
INSERT INTO CAR VALUES (300, 'VERNA', 9000000, '싸고 좋은 거 같아용~^^*')
/
INSERT INTO CAR VALUES (400, 'SANTAFE', 33000000, EMPTY_CLOB())
/

 

 

- 테이블 생성시 CLOB 타입 컬럼을 선언하고, 데이터 입력.

- 따로 SIZE는 지정하지 않는다.

- EMPTY_CLOB() 함수는 위치자(Locator)를 아무 것도 없는 데이터로 초기화시킨다.

 

:: 출처 : http://hwanyc.tistory.com/267

---------------------------------------------------------------------------------

1) import 시켜야할 API

 

① oracle.sql.BLOB

② oracle.sql.CLOB

③ oracle.jdbc.driver.OracleResultSet

 

2) CLOB

 

① DB에 CLOB 데이터형 쓰기

       // UPDATE 또는 INSERT 명령으로 DB 에 공간 확보
     String query = "UPDATE TABLE SET CLOB_DATA = EMPTY_CLOB() " ;
     stmt.executeUpdate(query);

     // 그런 다음 다시 요놈을 다시 SELECT
     query = "SELECT CLOB_DATA  FROM TABLE WHERE ~ " ;   

     stmt = dbConn.createStatement(); 
     rs = stmt.executeQuery(query);

     if(rs.next()) {
          CLOB clob = null;
          Writer writer = null;
          Reader src = null;
          char[] buffer = null;
          int read = 0;  

          clob = ((OracleResultSet)rs).getCLOB(1);         
          writer = clob.getCharacterOutputStream();

          // str -> DB에 넣을 내용
          src = new CharArrayReader(str.toCharArray()); 
          buffer = new char[1024]; 
          read = 0;
          while ( (read = src.read(buffer,0,1024)) != -1) { 
               writer.write(buffer, 0, read); // write clob. 
          }
          src.close();         
          writer.close();
     }

     dbConn.commit();
     dbConn.setAutoCommit(true);


 ② DB에서 CLOB 데이터형 읽기

 

 

      // SELECT
     String query = "SELECT CLOB_DATA  FROM TABLE WHERE ~ " ;   

     stmt = dbConn.createStatement(); 
     rs = stmt.executeQuery(query);

     if(rs.next()) {

          StringBuffer output = new StringBuffer(); 
          Reader input = rs.getCharacterStream("CLOB_DATA"); 
          char[] buffer = new char[1024]; 
          int byteRead = 0; 
          while((byteRead=input.read(buffer,0,1024))!=-1){ 
               output.append(buffer,0,byteRead); 
          } 
         

          // contents -> CLOB 데이터가 저장될 String
          String contents = output.toString();


     }

     dbConn.commit();
     dbConn.setAutoCommit(true);


 3) BLOB

① DB에 BLOB 데이터형 쓰기

      // UPDATE 또는 INSERT 명령으로 DB 에 공간 확보
     String query = "UPDATE TABLE SET BLOB_DATA = EMPTY_BLOB() " ;
     stmt.executeUpdate(query);

     // 그런 다음 다시 요놈을 다시 SELECT
     query = "SELECT BLOB_DATA  FROM TABLE WHERE ~ " ;   

     stmt = dbConn.createStatement(); 
     rs = stmt.executeQuery(query);

     if(rs.next()) {

          BLOB blob = null;
          BufferedOutputStream out = null;
          BufferedInputStream in = null;
          byte[] buf = null;
          int bytesRead= 0;  

          blob = ((OracleResultSet)rs).getBLOB(1);
          out = new BufferedOutputStream(blob.getBinaryOutputStream());

          // str -> DB에 넣을 내용
          in = new BufferedInputStream(new StringBufferInputStream(str));
          int nFileSize = (int)str.length();
          buf = new byte[nFileSize];
          
          while ((bytesRead = in.read(buf)) != -1){
               out.write(buf, 0, bytesRead);

          }

          in.close();
          out.close();
     }

     dbConn.commit();
     dbConn.setAutoCommit(true);


 ② DB에서 BLOB 데이터형 읽기

      // SELECT
     String query = "SELECT CLOB_DATA  FROM TABLE WHERE ~ " ;   

     stmt = dbConn.createStatement(); 
     rs = stmt.executeQuery(query);

     if(rs.next()) {

          BLOB blob = ((OracleResultSet)rs).getBLOB(1);

          BufferedInputStream in = new BufferedInputStream(blob.getBinaryStream());
          int nFileSize = (int)blob.length();
          byte[] buf = new byte [nFileSize];    
          int nReadSize = in.read(buf, 0, nFileSize);
          in.close();

           // contents -> BLOB 데이터가 저장될 String

          String contents = new String(buf);
     }

     dbConn.commit();
     dbConn.setAutoCommit(true);

출처 : Tong - 뚱뚱이총각님의 JAVA통

----------------------------------------------------------------------------

그다지 중요한건 아니지만, CLOB 사용법이 없는 듯해서 올립니다. 참고하시기 바랍니다.

*** CLOB type 에 insert 하는 부분입니다. ***
public void insertData(String key, String data){
    Connection con = null;
    PreparedStatement pstmt = null;
    try{
        con = ds.getConnection();
        pstmt = con.prepareStatement("insert into lobTbl values(?,?)");
        pstmt.setString(1, key);
        // 요기가 CLOB insert 하는 부분입니다. LONGVARCHAR 와 동일
        StringReader sr = new StringReader(data);
        pstmt.setCharacterStream(2, sr, data.length());

        pstmt.executeUpdate();
    }catch(SQLException se){
        se.printStackTrace();
    }finally{
        if(pstmt != null)
            try{pstmt.close();}catch(SQLException cs){cs.printStackTrace();}
        if(con != null)
            try{con.close();}catch(SQLException cs){cs.printStackTrace();}
    }
}

**** CLOB type select 하는 부분입니다. ****
while(rs.next()){
    Reader instream = rs.getCharacterStream("data");
    // create temporary buffer for read
    char[] buffer = new char[1024];
    // length of characters read
    int length = 0;

    // fetch data  
    while ((length = instream.read(buffer)) != -1)  {
        for (int i=0; i<length; i++){
            sb.append(buffer[i]);
        }
    }
    // Close input stream
    instream.close();
}

일반적인 Oracle 에서 CLOB 을 가져올 때는,

  CLOB clob = ((OracleResultSet)rs).getCLOB("data");

라는 형식으로 가져올 수 있습니다. 그러나 Weblogic6.1 의 테스트 결과 rs 가
weblogic.jdbc.rmi.SerialResultSet 이라는 객체형식으로 반환을 합니다. 그래서 위와같이
casting 하면 ClassCastException 이 발생합니다. 

  CLOB clob = ((SerialResultSet)rs).getCLOB("data");

하면 casting 은 문제가 없는데 CLOB 을 지원하지 않는다고 나옵니다. 그래서 위와같이
그냥 getCharacterStream 을 이용하면 됩니다.

조금이라도 도움이 되면 좋겠군요. 참고로 WebLogic 이 아닌 일반적인 Application 에서
Oracle 연결방식입니다.

while(rs.next()){
    System.out.println("key : " + rs.getString(1));
    CLOB clob = ((OracleResultSet)rs).getCLOB(2);
    // get character stream to retrieve clob data
    Reader instream = clob.getCharacterStream();
    // create temporary buffer for read
    char[] buffer = new char[1024];

    // length of characters read
    int length = 0;

    // fetch data  
    while ((length = instream.read(buffer)) != -1)  {
        for (int i=0; i<length; i++)     
            System.out.print(buffer[i]);
    }
    // Close input stream
    instream.close();
}
출처 : http://www.okjsp.pe.kr/seq/27800

728x90
반응형
LIST
728x90
반응형
LIST

Object 들 중에 STATUS 가 INVALID 인 것들을 재컴파일 해주는 과정이다. 

 

 DECLARE
    n_rowcount PLS_INTEGER := 0;
    n_rowcount2 PLS_INTEGER := 0;


    CURSOR cur_objects
    IS
        SELECT *
            FROM SYS.USER_OBJECTS
            WHERE  STATUS = 'INVALID'
AND OBJECT_TYPE IN ('PROCEDURE','FUNCTION','PACKAGE','PACKAGE BODY');
BEGIN
    LOOP
        n_rowcount2 := n_rowcount;
        n_rowcount := 0;
        FOR rec_objects IN cur_objects
        LOOP
            DBMS_DDL.ALTER_COMPILE(rec_objects.object_type,NULL,rec_objects.object_name);
            n_rowcount := cur_objects%ROWCOUNT;
        END LOOP;


        IF n_rowcount = 0 OR (n_rowcount = n_rowcount2) THEN
            EXIT;
        END IF;
    END LOOP;
END;
/

 

728x90
반응형
LIST
728x90
반응형
LIST

Tablespace

 - DBMS에 저장되는 자료가 있는 물리적인 파일.

 - 각 개체마다 테이블스페이스를 지정해 줄 수 있고, 사용자에게 기본으로 사용할 테이블스페이스를 지정할 수 있다.

 - 오라클에서는 기본적으로 /usr/local/oracle/oradata/[SID]/ 디렉토리에 기본 테이블스페이스를 생성하며,

    Oracle Express Edition에서는 /usr/lib/oracl/xe/oradata/XE/ 디렉토리에 기본 테이블스페이스를 저장한다.

 

 

 

테이블스페이스 생성

 테이블스페이스를 생성할 경우 여러 옵션이 사용될 수 있으나 테이블스페이스의 기본 용량을 자동으로 늘려주는

 옵션(autoextend) 등은 기본으로 사용하는 것이 편하다.

 
1
2
3
4
5
6
7
8
9
create tablespace 테이블스페이스명 (예: ts_jihyung)
 
datafile '테이블스페이스 파일 저장 경로 (예: D:/db/테이블스페이스명.dbf)'
 
size 파일 용량 (예: 50M)
 
autoextend on
 
extent management local autoallocate;
 
 

Temp 테이블스페이스 생성

Temp 테이블스페이스의 최소 용량은 1 MByte 이상이다. 그러므로 처음 생성시 2 MByte로 생성 한 뒤 자동증가 옵션을 사용한다

 
1
2
3
4
5
6
7
8
9
create temporary tablespace 테이블스페이스명 (예: ts_temp_jihyung)
 
tempfile 'Temp 테이블 스페이스 파일 저장 경로 (예: D:/db/Temp테이블스페이스명.dbf)'
 
size 파일 용량 (예: 2M)
 
autoextend on
 
extent management local;
 
 

 

테이블스페이스 삭제

 특별한 경우가 아니라면 테이블스페이스의 모든 내용을 자동으로 지우고 파일까지 깔끔하게 삭제할 수 있다.

 이 옵션이 바로 "including contents AND datafiles"이다.

 
1
2
3
4
5
drop tablespace 테이블스페이스명
 
including contents and datafiles
 
cascade constraints;

 

728x90
반응형
LIST
728x90
반응형
LIST
SELECT DBMS_METADATA.GET_DDL('TABLE','테이블명')
FROM USER_ALL_TABLES u
WHERE u.nested='NO' AND (u.iot_type is null or u.iot_type='IOT');
728x90
반응형
LIST

+ Recent posts