레이블이 oracle인 게시물을 표시합니다. 모든 게시물 표시
레이블이 oracle인 게시물을 표시합니다. 모든 게시물 표시

Oracle - 데이터베이스 링크(Database Link)란

* 데이터베이스 링크는 클라이언트 또는 현재의 데이터베이스에서 네트워크상의 다른 데이터베이스에 접속하기 위한 접속 설정을 정의하는 오라클 객체이다.

* 오라클 INSTANCE가 두 개 이상이고, 각각의 HOST NAME과 ORACLE_SID는 다르고 NLS_CHARACTER_SET은 동일하게 되어 있어야 한다.

* 문법
Create [public] database link link_nm connect to username identified by password using service_nm

link_nm : 데이터베이스 링크의 이름
service_nm : 네트워크 접속에 사용할 오라클 데이터베이스 네트워크 서비스명을 지정
username, password : 오라클 사용자명과 비밀번호를 지정

Oracle - 커넥션수 및 세션정보 조회하기

* 커넥션 수 조회하기
세션에 대한 정보는 V$SESSION을 참고.
SELECT
    COUNT(*)
FROM V$SESSION s
WHERE s.username IS NOT NULL
    AND NVL (s.osuser, 'x') 'SYSTEM'
    AND s.TYPE 'BACKGROUND';

* 세션 정보 조회
SELECT /*+ rule */
    s.status "Status", s.serial# "Serial#", s.TYPE "Type",
    s.username "DB User", s.osuser "Client User", s.server "Server",
    s.machine "Machine", s.module "Module", s.terminal "Terminal",
    s.program "Program", p.program "O.S. Program",
    s.logon_time "Connect Time", lockwait "Lock Wait",
    si.physical_reads "Physical Reads", si.block_gets "Block Gets",
    si.consistent_gets "Consistent Gets",
    si.block_changes "Block Changes",
    si.consistent_changes "Consistent Changes", s.process "Process",
    p.spid, p.pid, s.serial#, si.sid, s.sql_address "Address",
    s.sql_hash_value "Sql Hash", s.action
FROM V$SESSION s, V$PROCESS p, SYS.V_$SESS_IO si
WHERE s.paddr = p.addr(+)
    AND si.sid(+) = s.sid
    AND s.username IS NOT NULL
    AND NVL (s.osuser, 'x') 'SYSTEM'
    AND s.TYPE 'BACKGROUND'
ORDER BY 3;

Oracle - 유저 계정의 잠금 및 잠금 해제, 그리고 암호를 만료 하는 법

* 사용자 계정 잠금
명시적으로 사용자의 계정을 잠글 경우 사용.
SYSDBA 권한으로 접속 한다 C:\> SQLPLUS / AS SYSDBA
scott유저의 계정을 잠금 SQL> ALTER USER scott ACCOUNT LOCK;

* 사용자 계정 잠금 해제
SYSDBA 권한으로 접속 한다 C:\> SQLPLUS / AS SYSDBA
scott유저의 계정 잠금 해제 SQL> ALTER USER scott ACCOUNT UNLOCK;

* 비밀 번호 만료
SYSDBA 권한으로 접속 한다 C:\> SQLPLUS / AS SYSDBA
scott유저의 암호를 만료 시킨다. SQL> ALTER USER scott PASSWORD EXPIRE;

Oracle - COPY명령으로 테이블 복사하기

* SQL*Plus에서 COPY라는 명령어를 이용해서 테이블을 복사 할 수 있는 기능을 제공.
COPY명령어는 SQL*Net이 설치되어 있어야하고, SQL*Plus에서만 사용 가능.


* 문법
COPY FROM 복사해올유저명

    CREATE 생성할 테이블명
    USING 원본 테이블 질의
 

* 사용예
SQL> COPY FROM scott/tiger@oracle
        CREATE emp2 USING SELECT * FROM emp;

Oracle - 유저의 패스워드를 쉽게 바꾸는 방법

* SQL*Plus에서 PASSWORD 명령으로 쉽게 유저의 패스워드를 변경 할 수 있다.

* 사용예
SQL> PASSWORD;
SCOTT에 대한 암호를 변경합니다
이전 암호: *****
새로운 암호: ******
새로운 암호를 다시입력합니다: ******

Oracle - LIKE연산자에서 '%'와 '_'를 포함하는 단어 검색 방법

* LIKE 연산으로 '%'나 '_'가 들어간 문자를 검색하기 위해서는 ESCAPE를 사용.
'_'나 '%'앞에 ESCAPE로 특수 문자를 지정하면 검색할 수 있다.


* '_' 가 있는 문자 검색
SELECT

    loc
FROM dept
WHERE loc like '%#_%' ESCAPE '#';
=>
NEW_YORK


SELECT

    loc
FROM dept
WHERE loc like '%N%@_%' ESCAPE '@'
=>
NEW_YORK


SELECT

    loc
FROM dept
WHERE loc like '%_%';
=>
NEW_YORK
DALLAS
CHICAGO
BOSTON

Oracle - 랜덤 사용하기

* DBMS_RANDOM 패키지를 사용하면 숫자와 문자의 랜덤 데이터를 생성할 수 있으며, 테이블 데이터를 램덤한 순서로 정렬하여 조회할 수 있다.

* DBMS_RANDOM.VALUE
랜덤한 숫자를 생성한다.
Syntax : DBMS_RANDOM.VALUE(low IN NUMBER, high IN NUMBER)
파라미터 low는: 최소 범위, high는: 최대 범위 값이다.

SELECT DBMS_RANDOM.VALUE(1000, 10000) rand FROM DUAL;
=> 5942.39469
 

* DBMS_RANDOM.STRING
랜덤한 문자열을 생성한다.
Syntax : DBMS_RANDOM.STRING opt IN CHAR, len IN NUMBER)
- opt (옵션)은 아래와 같다.
'u', 'U' : 대문자
'l', 'L' : 소문자
'a', 'A' : 대소문자 구분없는 영문자
'x', 'X' : 영문자와 숫자 혼합
'p', 'P' : 문자 혼합
SELECT DBMS_RANDOM.STRING('U', 10) rand FROM DUAL -- 대문자
=> NSBJGKKQCL


* DBMS_RANDOM.RANDOM
DBMS_RANDOM.RANDOM은 랜덤 한 숫자를 생성.
DBMS_RANDOM.RANDOM 함수를 이용하여 데이터를 랜덤한 순서로 정렬.

Oracle - DATE Format 변경하기

* INIT[dbname].ora 파일 수정하기
NLS_DATE_FORMAT = 'RR-MM-DD' 이와 같이 변수와 값을 추가.


* Shell 프로그램 이용
C Shell: OS 상태에서 setenv NLS_DATE_FORMAT 'RR/MM/DD'추가.
B Shell: NLS_DATE_FORMAT='RR/MM/DD' export NLS_DATE_FORMAT 추가.
K Shell: B Shell 방법과 추가로 export NLS_DATE_FORMAT='RR/MM/DD' 로 표현 가능


* SYS.PROPS$ VIEW를 이용하여 UPDATE하는 방법
 

* Session 에서 set 하는 방법
SQLPLUS 상태에서 ALTER SESSION SET NLS_DATE_FORMAT='RR/MM/DD' 실행
단 SESSION 내에서만 활용가능

Oracle - 사용자 세션 강제 종료하기

* ALTER SYSTEM문을 KILL SESSION 연산자와 함께 사용.
사용자의 SESSION KILL은 ALTER SYSTEM 권한 필요.


* ALTER SYSTEM KILL SESSION 명령어가 수행하는 작업
사용자의 현재 트랜잭션을 롤백 한다.
현재 사용중인 모든 테이블 또는 행의 LOCK을 해제 한다.
사용자에의해 예약 되었던 시스템 자원을 해제 한다.
 

* 문법
Alter System kill session '세션아이디.시리얼번호‘;
세션ID와 시리얼번호를 확인하기 위해서는 V$SESSION 뷰를 조회

Oracle - 데이터 파일 이동하기

* ALTER DATABASE를 이용한다.
1) 데이터베이스를 종료 한다.
2) 운영체제 명령을 사용하여 데이터 파일을 이동 한다.
3) 데이터베이스를 마운트 모드로 시작한다.
4) ALTER DATABASCE RENAME FILE명령을 수행하여 이름을 변경한다.
5) 인스턴스를 시작한다

Oracle - 데이터 파일 관리

* 데이터 파일의 크기 조절하기
기존 데이터 파일들은 ALTER DATABASE와 ALTER TABLESPACE 명령어로 크기를 재조정.

ALTER DATABASE
    DATAFILE 'C:\ORACLE\ORADATA\ORACLE\SYSTEM01.DBF'
    RESIZE 400m;



* 데이터 파일 자동 확장 하기
CREATE DATABASE, CREATE TABLESPACE, ALTER TABLESPACE 명령을 사용

CREATE TABLESPACE KJS
    DATAFILE 'C:\ORACLE\ORADATA\ORACLE\KJS.DBF'
    SIZE 300M
    AUTOEXTEND ON
    NEXT 10M
    MAXSIZE 500M;



* 새로운 데이터 파일을 기존 테이블 스페이스에 추가하기
KJS테이블 스페이스에 AUTOEXTEND, MAXSIZE를 명시하고 100메가의 KJS_01.DBF파일을 추가 하는 예.

ALTER TABLESPACE KJS
    ADD DATAFILE 'C:\ORACLE\ORADATA\ORACLE\KJS_01.DBF' SIZE 100M
    AUTOEXTEND ON
    MAXSIZE 300M;



* 기존 파일의 속성 변경하기
ALTER DATABASE명령을 이용하면 된다.

ALTER DATABASE
    DATAFILE 'C:\ORACLE\ORADATA\ORACLE\KJS_01.DBF'
    AUTOEXTEND ON
    MAXSIZE 500M;

Oracle - 중복된 ROW 데이터 삭제 방법

* ROWID를 사용하여 중복된 ROW를 제거 할 수 있다.

* 중복된 데이터중에서 ROWID가 큰 값(나중에 등록된 데이터) 제거
DELETE FROM emp a
WHERE ROWID > (SELECT MIN(ROWID)
                         FROM emp b
                         WHERE b.empno = a.empno);
 

* 나중에 들어온 데이터를 살릴경우
DELETE FROM emp a
WHERE ROWID < (SELECT MAX(ROWID)
                         FROM emp b
                         WHERE a.empno = b.empno);

Oracle - 테이블, 컬럼 제약 조건의 확인하기

* 테이블에 걸려있는 제약 조건의 확인하기
USER_CONS_COLUMNS : 컬럼에 할당된 제약 조건을 볼 수 있다.
USER_CONSTRAINTS : 유저가 소유한 모든 제약 조건을 불 수 있다.


SELECT 

    SUBSTR(A.COLUMN_NAME,1,15) COLUMN_NAME,
    DECODE(B.CONSTRAINT_TYPE,
        'P','PRIMARY KEY',
        'U','UNIQUE KEY',
        'C','CHECK OR NOT NULL',
        'R','FOREIGN KEY') CONSTRAINT_TYPE,
    A.CONSTRAINT_NAME CONSTRAINT_NAME
FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B
WHERE A.TABLE_NAME = UPPER('&table_name')
    AND A.TABLE_NAME = B.TABLE_NAME
    AND A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
ORDER BY 1;




* 테이블의 특정 컬럼에 걸려있는 제약 조건의 확인하기
USER_CONS_COLUMNS : 컬럼에 할당된 제약 조건을 볼 수 있다.


SELECT 

    SUBSTR(TABLE_NAME,1,15) TABLE_NAMES,
    SUBSTR(COLUMN_NAME,1,15) COLUMN_NAME,
    SUBSTR(CONSTRAINT_NAME,1,25) CONSTRAINT_NAME
FROM USER_CONS_COLUMNS
WHERE TABLE_NAME = UPPER('&table_name')
    AND COLUMN_NAME = UPPER('&column_name');

Oracle - DB에 등록된 USER 정보와, USER별 Object 정보 조회하기

* DB에 등록된 USER 정보 조회하기
SYS 사용자로 접속하여 DBA_USERS 데이터 사전을 조회.
SELECT username, default_tablespace, temporary_tablespace, created FROM DBA_USERS;




* USER의 Object 정보 조회하기
USER_OBJECTS 데이터 사전을 조회.
SELECT object_name, object_type FROM USER_OBJECTS WHERE object_type = 'INDEX';

Oracle - Switch문 기능 구현하기

* Decode 함수를 사용하여 Switch 기능을 구현할 수 있다.
DECODE (컬럼명 | 표현식
                     , 조건1, 결과1
                     , 조건2, 결과2
                     .......
                     , 조건n, 결과n
                     , 결과
)


[컬럼명 |표현식] : 이 값을 조건1부터 조건n까지 순차적으로 비교하여 같으면 해당 결과 return.
[결과] : 조건1 ~ 조건n에 모두 해당되지 않는 경우 return되는 기본값
 


* 사용예
SELECT
    DECODE ('A'
        , 'A', 'Aaa'
        , 'B', 'Bbb'
        , 'Ccc'
    )
FROM DUAL;
==> Aaa


SELECT
    DECODE ('B'
        , 'A', 'Aaa'
        , 'B', 'Bbb'
        , 'Ccc'
    )
FROM DUAL;
==> Bbb

Oracle - 테이블 락 확인하기

* 현재 테이블에 락이 걸려있는지 조회할 수 있다.


* 락 테이블 조회하기
SELECT
      B.OBJECT_NAME, B.OWNER, B.OBJECT_TYPE

      , A.XIDUSN, A.SESSION_ID, A.LOCKED_MODE
FROM V$LOCKED_OBJECT A, DBA_OBJECTS B
WHERE A.OBJECT_ID = B.OBJECT_ID
;
 

* 특정 테이블 락 여부 확인하기
SELECT
     A.SID, A.SERIAL#

     , B.TYPE, C.OBJECT_NAME
FROM V$SESSION A, V$LOCK B, DBA_OBJECTS C
WHERE A.SID=B.SID

  AND B.ID1=C.OBJECT_ID
  AND B.TYPE='TM'
  AND C.OBJECT_NAME = '테이블명'
;

Oracle - 한 쿼리로 INSERT 혹은 UPDATE 하기

* 테이블에 데이터 추가시 조건에 해당하는 값이 존재하면 해당 행을 UPDATE하고,
없으면 INSERT 하는 경우 사용


* 사용법
MERGE INTO [ schema. ] { table | view } [ t_alias ]
   USING { [ schema. ] { table | view } | subquery } [ t_alias ]
   ON ( condition )
WHEN MATCHED THEN
UPDATE SET column = { expr | DEFAULT }
              [, column = { expr | DEFAULT } ]...
[ DELETE where_clause ]
WHEN NOT MATCHED THEN
INSERT [ (column [, column ]...) ]
VALUES ({ expr [, expr ]... | DEFAULT })



- INTO : DATA가 UPDATE되거나 INSERT 될 테이블
- USING : 비교할 SOURCE 테이블 혹은 서브쿼리.

              INTO절의 테이블과 동일하거나 다를 수 있음.
- ON : UPDATE나 INSERT를 하게 될 조건.

         해당 조건을 만족하는 DATA가 있으면 WHEN MATCHED 절 실행
              , 없으면 WHEN NOT MATCHED 절 실행.
- WHEN MATCHED : ON 조건절이 TRUE인 ROW에 수행 할 내용.

                            (UPDATE, DELETE 포함 될 수 있음)
- WHEN NOT MATCHED : ON 조건절에 맞는 ROW가 없을 때 수행할 내용.

                                   (INSERT)

Oracle - UNION, UNION ALL

*** UNION ***
두 테이블을 결합한 결과를 반환하는데 중복되지 않는 값들만 반환.
결과는 정렬되어서 반환.


*** UNION ALL ***
두 테이블을 결합한 결과를 반환하는데 중복되는 값들도 모두 반환.


ex) 
TABLE_1                           TABLE_2
---------                         ---------
COL_A                              COL_A
---------                         ---------
1                                         3
2                                         2
3                                         1

select COL_A from TABLE_!
union
select COL_A from TABLE_2
=> 결과
1
2
3

select COL_A from TABLE_!
union all
select COL_A from TABLE_2
=> 결과
1
2
3
3
2
1

Oracle - LPAD, RPAD 함수

*** 사용법 ***
좌측(LPAD) 혹은 우측(RPAD)에 원하는 길이만큼 특정 문자를 채워서 반환한다.


*** 문법 ***
LPAD (변수, 길이, 문자)
RPAD (변수, 길이, 문자)

*** 예제 ***
select LPAD('test', 10, '#') from dual;
=> ######test


select RPAD('test', 10, '#') from dual;
=> test######


select LPAD('test', 2, '#') from dual;
=> te


select RPAD('test', 2, '#') from dual;
=> te

select LPAD('test', 9, '123') from dual;
=> 12312test


select RPAD('test', 9, '123') from dual;
=> test12312


스프링 프레임워크 HikariCP Oracle 설정 Sample

*** xml configuration ***
<bean id="pcmsHikariConfig" class="com.zaxxer.hikari.HikariConfig">
  <property name="poolName"                    value="poolname" />
  <property name="connectionTestQuery"   value="SELECT 1 FROM DUAL" />
  <property name="dataSourceClassName" value="oracle.jdbc.pool.OracleDataSource" />
  <property name="maximumPoolSize"        value="10" />
  <property name="idleTimeout"                  value="600000" />
  <property name="dataSourceProperties">
        <props>
            <prop key="url">jdbc:oracle:thin:@localhost:1521:ORCL</prop>
            <prop key="user">admin</prop>
            <prop key="password">adminpw</prop>
        </props>
  </property>
</bean>